如何在OpenCV中绘制随机颜色的圆形

8
我正在使用OpenCV的SURF算法来匹配两张图片,并且已经得到了关键点。现在我想用随机颜色的圆圈来画出这些关键点。我知道如何使用cvCircle函数在OpenCV中画一个圆,但是颜色是固定的,使用cvScalar(r,g,b)函数可以指定。我希望在图像中的关键点的圆圈颜色与其附近的圆圈不同。OpenCV库函数cv::drawMatches()实现了我想要的效果,但是我不知道如何实现它。有人能告诉我如何画这些圆吗?谢谢!
3个回答

17

假设您想在Mat图像上以不同颜色绘制圆圈。以下是一种生成随机颜色的方法:

RNG rng(12345);
Mat image = Mat::zeros(500, 500, CV_8UC3);     // change to the size of your image
for (int i = 0; i < circleNum; i++) {
    Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255));
    circle(image, center[i], radius[i], color, -1, 8, 0);
}

3
很好。我建议使用HSL或HSV颜色空间生成一个饱和度和/或强度最大的颜色,然后仅更改色相和/或值,然后转换回RGB。这将使您获得较少的灰色。 - Joel Teply

4
使用此方法,应该可以绘制您的匹配项。

cv::drawKeypoints(matOriginal, keyPoints, matOriginal);

这个方法可以绘制关键点。

4

只需生成随机数列表,然后将它们转换为 int 否则会出现错误: TypeError:Scalar value for argument 'color' is not numeric. 所以将其转换为整数,然后用于圆形函数。

color1 = (list(np.random.choice(range(256), size=3)))  
color =[int(color1[0]), int(color1[1]), int(color1[2])]  
cv.circle(img3, (x1,y1), 2,color,2)  

将您的图像放在要绘制圆圈的位置。

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