gpt4 book ai didi

python - 检测红色和绿色圆圈

转载 作者:太空宇宙 更新时间:2023-11-03 21:16:22 28 4
gpt4 key购买 nike

我想在下图中(以及其他一些类似的图像)中分别检测红色和绿色圆圈

image

我正在使用 opencv 和 python。

我试过使用 houghcircles,但即使在更改参数后也没有任何帮助。

任何关于如何做到这一点的建议都会有很大帮助。如果有人发送代码,我将不胜感激

最佳答案

您在评论中提到圆圈的大小始终相同。让我们利用这个事实。我的代码片段是用 C++ 语言编写的,但这应该不是问题,因为它们只是在这里显示要使用哪些 OpenCV 函数(以及如何使用)...

TL; DR 这样做:

  1. 创建典型的圆形图像 - 模板图像。
  2. 使用template matching获取所有圈子位置。
  3. 检查每个圆圈的颜色。

现在,让我们开始吧!

第 1 步 - 模板图像

您需要一张显示与背景明显分开的圆圈的图片。您有两个选择(两者都同样好):

  • 自己制作这样的图像(如果知道半径就计算它),或者
  • 只需从您正在处理的场景中截取一张图像,然后裁剪一个清晰可见的圆圈并将其另存为单独的图像(我就是这样做的,因为这是一个更快捷的选择)

圆圈可以是任何颜色 - 唯一重要的是它与背景不同。

enter image description here

第 2 步 - 模板匹配

加载图像和模板图像并将它们转换为HSV color space .然后拆分 channel ,以便您只能使用饱和 channel :

using namespace std;
using namespace cv;

Mat im_rgb = imread("circles.jpg");
Mat tm_rgb = imread("template.jpg");

Mat im_hsv, tm_hsv;
cvtColor(im_rgb, im_hsv, CV_RGB2HSV);
cvtColor(tm_rgb, tm_hsv, CV_RGB2HSV);
vector<Mat> im_channels, tm_channels;
split(im_hsv, im_channels);
split(tm_hsv, tm_channels);

这就是圆圈和模板现在的样子:

enter image description here enter image description here

接下来,您必须获取包含有关圆形边框 信息的图像。无论您如何实现这一点,您都必须对图像和模板饱和度 channel 应用完全相同的操作。我使用 sobel 运算符来完成工作。代码示例只展示了我对图像饱和 channel 所做的操作;模板饱和 channel 经历了完全相同的过程:

Mat im_f;
im_channels[1].convertTo(im_f, CV_32FC1);
GaussianBlur(im_f, im_f, Size(3, 3), 1, 1);
Mat sx, sy;
Sobel(im_f, sx, -1, 1, 0);
Sobel(im_f, sy, -1, 0, 1);

Mat image_input = abs(sx) + abs(sy);

这就是获得的图像和模板上的圆圈的样子: enter image description here enter image description here

现在,执行模板匹配。我建议您选择计算归一化相关系数的模板匹配类型:

Mat match_result;
matchTemplate(image_input, template_input, match_result, CV_TM_CCOEFF_NORMED);

这是模板匹配结果:

enter image description here

如果您将模板放在图像上的不同位置,此图像会告诉您模板与底层图像的关联程度。例如,像素 (0,0) 处的结果值对应于输入图像上位于 (0,0) 处的模板。

当模板放置在与底层图像匹配良好的位置时,相关系数很高。使用阈值方法丢弃信号峰值以外的所有内容(模板匹配的值将位于 [-1, 1] 区间内,您只对接近 1 的值感兴趣):

Mat thresholded;
threshold(match_result, thresholded, 0.8, 1.0, CV_THRESH_BINARY);

enter image description here

接下来,确定每个隔离区域内模板结果最大值的位置。为此,我建议您使用阈值图像作为 mask 。每个区域内只需要选择一个最大值。

这些位置告诉您必须将模板放置在哪里,以便它与圆圈最匹配。我绘制了从这些点开始并与模板图像具有相同宽度/高度的矩形:

enter image description here

第三步:圆圈的颜色

现在您知道模板应该放置在哪里,以便它们很好地覆盖圆圈。但是您仍然需要找出圆心在模板图像上的位置。您可以通过计算模板饱和 channel 的质心来做到这一点:

enter image description here

在图像上,圆心位于这些点:

Point circ_center_on_image = template_position + circ_center_on_template;

现在您只需检查这些点的红色 channel 强度是否大于绿色 channel 强度。如果是,则圆圈为红色,否则为绿色:

enter image description here

关于python - 检测红色和绿色圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42315959/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com