如何在一次openCv中更快地画出上千个圆圈--(可能使用GPU)

问题描述 投票:1回答:1

我需要在图像(视频帧)的给定区域上绘制数千个点。

使用循环是最简单的方法。

    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;

这个过程需要很长的时间来完成。

如何才能更有效地实现这一目标?

python opencv parallel-processing gpu gpu-programming
1个回答
1
投票

也许可以使用一些技巧来加快它的速度。

试着摆脱循环,并将你的操作矢量化. 你可以通过传入... sizerandom.randint. 如果经过过滤后,它们并不等同于。num,你可以生成另一个集合。

而不是 pointPolygonTest,也许你可以试试 matplotlib.path.Path.contains_points 在一个点的矢量上操作,而不是单一的点。

对于圆,一旦你过滤了所有的圆心,就创建一个全零图像来绘制你的圆,然后在这个图像中标记圆心(再次,矢量化)。如果你想要彩色的圆,你必须为每个通道设置适当的灰度级别的像素值。然后使用具有所需半径的圆形结构元素进行扩张。对于小半径,这些圆圈应该是可以的。或者,你也可以尝试高斯模糊,因为,如果你用脉冲卷积一个高斯,就会得到一个高斯,而对称的高斯在图像中会像一个圆。如果你的圆有相同的大小,你也可以用filter2D来做这件事。如果扩张效果不好,你可以创建自己的核,类似于你想要的圆,然后用中心图像卷积。

将所有非零像素从这个 circles 图像到您的 img 使用 circles 图像作为蒙版。

一个简单的创建圆圈的例子。

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)

中心:

centers

使用扩张的圆

dcircles

使用高斯模糊的圆:

gcircles

© www.soinside.com 2019 - 2024. All rights reserved.