gpt4 book ai didi

OpenCV 正方形 : filtering output

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

这是方 block 检测示例的输出我的问题是过滤这个方 block

http://ozsulastik.com/ocvsquares.png

  • 第一个问题是它为同一区域绘制多条线;
  • 第二个是我只需要检测对象而不是所有图像。

另一个问题是我必须只取除所有图像之外的最大对象。

http://ozsulastik.com/ocvsquares2.png

检测代码如下:


static void findSquares(const Mat& image, vector >& squares){



squares.clear();

Mat pyr, timg, gray0(image.size(), CV_8U), 灰色;

//缩小和放大图像以滤除噪声
pyrDown(图像,pyr,尺寸(image.cols/2,image.rows/2));
pyrUp(pyr, timg, image.size());
矢量<矢量<点>>轮廓;

//在图像的每个颜色平面中找到正方形
对于(int c = 0;c < 3;c++)
{
int ch[] = {c, 0};
mixChannels(&timg, 1, &gray0, 1, ch, 1);

//尝试几个阈值级别
for( int l = 0; l < N; l++ )
{
//hack:使用 Canny 而不是零阈值级别。
//Canny 帮助捕捉带有渐变阴影的正方形
如果(我==0)
{
//应用 Canny。从 slider 中获取上阈值
//并将 lower 设置为 0(强制边缘合并)
Canny(gray0, gray, 0, thresh, 5);
//扩大精明的输出以消除潜在的
//边缘段之间的孔
膨胀(灰色,灰色,Mat(),点(-1,-1));
}
别的
{
//如果 l!=0 应用阈值:
灰色 = 灰色 0 >= (l+1)*255/N;
}

//查找轮廓并将它们全部存储为列表
findContours(灰色,轮廓,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);

矢量<点>约;

//测试每个轮廓
对于( size_t i = 0; i < contours.size(); i++ )
{
approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);

如果(大约大小()== 4 &&
fabs(contourArea(Mat(approx))) > 1000 &&
isContourConvex(Mat(approx)) )
{
双最大余弦 = 0;

对于(整数 j = 2;j < 5;j++)
{
//找到关节边之间夹角的最大余弦值
双余弦 = fabs(角度(约[j%4],约[j-2],约[j-1]));
maxCosine = MAX(maxCosine, 余弦);
}

如果(最大余弦 < 0.3)
squares.push_back(大约);
}
}
}
}

}

最佳答案

您需要查看 findContours() 的标志.您可以设置一个名为 CV_RETR_EXTERNAL 的标志,它将只返回最外层的轮廓(它内部的所有轮廓都被丢弃)。这可能会返回整个框架,因此您需要缩小搜索范围,这样它就不会检查您的框架边界。使用函数 copyMakeBorder() 来完成此操作。我还建议删除扩张功能,因为它可能会导致线条两侧出现重复轮廓(如果删除扩张功能,您甚至可能不需要边框)。这是我的输出: enter image description here

关于OpenCV 正方形 : filtering output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14975304/

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