Python 如何一次绘制数千个圆openCv更快-(可能使用GPU)
我需要在图像(视频帧)的给定区域上绘制数千个点 使用循环是最简单的方法Python 如何一次绘制数千个圆openCv更快-(可能使用GPU),python,opencv,parallel-processing,gpu,Python,Opencv,Parallel Processing,Gpu,我需要在图像(视频帧)的给定区域上绘制数千个点 使用循环是最简单的方法 while i < num: x = random.randint(min_x, max_x) y = random.randint(min_y, max_y) //this if is to check the the random points are within the original shape if cv2.pointPolygonT
while i < num:
x = random.randint(min_x, max_x)
y = random.randint(min_y, max_y)
//this if is to check the the random points are within the original shape
if cv2.pointPolygonTest(contour, (int(x), int(y)), False)==1:
cv2.circle(img, (int(x), int(y)), 2, color, -1)
i = i+1;
而i
这个过程需要很长时间才能完成
如何才能更有效地实现这一点?也许可以使用以下几个技巧来加快速度: 尝试摆脱循环并将操作矢量化。 您可以通过将
size
传递到random.randint
来对(x,y)点生成进行矢量化。如果过滤后它们的值不等于num
,则可以生成另一个集合
您可以尝试使用matplotlib.path.path.contains_points
,而不是pointpolyContest
,它在点向量上而不是单个点上运行
对于圆,过滤完所有圆心后,创建一个全零图像来绘制圆,然后在此图像中标记圆心(同样,矢量化)。如果您想要彩色圆圈,您必须为每个通道将像素值设置为适当的灰度。然后使用具有所需半径的圆形结构元素进行扩张。对于小半径,这些圆应该很好。或者,你也可以尝试高斯模糊,因为如果你用脉冲卷积一个高斯,它会给你一个高斯,一个对称的高斯将类似于图像中的一个圆。如果圆的大小相同,也可以使用filter2D执行此操作。如果膨胀结果不好,您可以创建自己的内核,类似于您想要的圆,然后将其与图像中心卷积
使用圆圈
图像作为遮罩,将此圆圈
图像中的所有非零像素复制到您的img
创建圆的一个简单示例:
import numpy as np
import cv2 as cv
# create random centers for circles
img = np.random.randint(low=0, high=1000, size=(256, 256))
img = np.uint8(img < 1) * 255
# use Gaussian bluer to create cricles
img1 = cv.GaussianBlur(img, (9, 9), 3)*20
# use morphological dilation bluer to create cricles
se = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
img2 = cv.dilate(img, se)
将numpy导入为np
将cv2作为cv导入
#为圆创建随机中心
img=np.random.randint(低=0,高=1000,大小=(256,256))
img=np.uint8(img<1)*255
#使用高斯蓝创建色圈
img1=cv.GaussianBlur(img,(9,9,3)*20
#使用形态扩张蓝笔创建圆环
se=cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
img2=cv.扩张(img,se)
中心:
使用膨胀的圆:
使用高斯模糊的圆:
welcome.枚举轮廓内的所有点(您可以使用
fillPoly
在黑色图像上绘制填充轮廓,然后检索所有非零像素)。然后随机选择N个点作为你的中心(你不需要再次检查它是否在多边形内)。谢谢你的回答,我很难理解第三个点,你用圆形结构来扩张是什么意思element@Eshaka标记中心后,创建具有所需半径的圆形结构元素,然后使用morphologyEx
进行放大,或者只使用放大
@Eshaka添加了一个创建圆圈的示例,因为我在解释中可能不清楚。