Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何一次绘制数千个圆openCv更快-(可能使用GPU)_Python_Opencv_Parallel Processing_Gpu - Fatal编程技术网

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添加了一个创建圆圈的示例,因为我在解释中可能不清楚。