如何使用Python OpenCV在图像中绘制给定坐标的点?

54

我有一张图片和一个坐标(X, Y),如何在这个坐标上绘制一个点到图片上。我想使用Python OpenCV实现。


2
可能需要先进行一些研究,比如阅读覆盖所有内容的OpenCV文档中的教程。| 我真的不明白为什么有人会点赞这个——对我来说,这显然是一个“没有展示任何研究努力”的案例。 - Dan Mašek
@DanMašek,我理解你的观点,但公正地说,我认为OpenCV教程并没有展示如何在Python中从头开始创建图像——即使是最基本的几个教程也只是展示了如何加载Messi的图像,然后就直接进入了numpy,几乎没有解释如果没有numpy你该如何做任何事情或者如果你不想编辑Messi先生,你该如何创建一个空白图像。 - Mark Setchell
Python和OpenCV是需要安装的相当多的软件...我猜你最终打算做一些更复杂的事情? - Mark Setchell
@MarkSetchell 是的,我想有些地方确实存在差距。在我看来,numpy快速入门教程也是需要理解的内容。你无法避免使用numpy,因为在Python绑定中,numpy.array被用来表示cv::Mat(例如图像)。 - Dan Mašek
@DanMašek 感谢您提供的链接 - 我一直使用OpenCV的C++绑定,但是我发现使用NumPy + Python的方式也很具有挑战性,因为我两者都不熟悉。 - Mark Setchell
也许你可以使用OpenCV的putText来实现这个目的。这里可能会有所帮助。 - Rayees
2个回答

91
你可以使用OpenCV模块的cv2.circle()函数:
image = cv.circle(image, centerOfCircle, radius, color, thickness)

radius保持为0以绘制单个点,将thickness设为负数以绘制填充的圆

import cv2
image = cv2.circle(image, (x,y), radius=0, color=(0, 0, 255), thickness=-1)

简单而有效 - Vadim
1
圆形函数允许您绘制任意大小的点。如果您只想让您的点的大小为一个像素,使用Mark Setchell的答案更有效。 - Leland Hepworth
有没有办法我可以使用坐标数组并执行相同的操作?而不是在一个坐标上? - McLovin

26

我也在学习 Python 对 OpenCV 的绑定方法。以下是一种方式:

#!/usr/local/bin/python3
import cv2
import numpy as np

w=40
h=20
# Make empty black image
image=np.zeros((h,w,3),np.uint8)

# Fill left half with yellow
image[:,0:int(w/2)]=(0,255,255)

# Fill right half with blue
image[:,int(w/2):w]=(255,0,0)

# Create a named colour
red = [0,0,255]

# Change one pixel
image[10,5]=red

# Save
cv2.imwrite("result.png",image)

这是结果 - 放大后您可以看到它。

输入图像描述


这是非常简洁但不太有趣的答案:

#!/usr/local/bin/python3
import cv2
import numpy as np

# Make empty black image
image=np.zeros((20,40,3),np.uint8)

# Make one pixel red
image[10,5]=[0,0,255]

# Save
cv2.imwrite("result.png",image)

输入图像描述


1
如果您只需要绘制一个像素大小的点,那么这是最有效的。如果您想要更大的点,请使用Dhanashree Desai的答案 - Leland Hepworth
此外,如果您使用此方法,需要先用 y 值指定坐标,然后再使用 x 值。这是因为在 numpy 中,第一轴表示行,第二轴表示列。 - Leland Hepworth
1
如果您想要放大您的点,使用我的技巧仍然更有效率,只需执行 im[10:14, 5:9] = [0,0,255] - Mark Setchell
1
@LelandHepworth,我故意将点放在[10,5]处,以便清楚地表明它比横向更靠下,从而精确地说明行先于列的观点。 - Mark Setchell
好的点。那将会形成一个更大的正方形,并且仍然非常高效。 - Leland Hepworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接