这是方 block 检测示例的输出我的问题是过滤这个方 block
- 第一个问题是它为同一区域绘制多条线;
- 第二个是我只需要检测对象而不是所有图像。
另一个问题是我必须只取除所有图像之外的最大对象。
检测代码如下:
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(大约);
}
}
}
}
点>点>
}
Bạn cần kiểm tra findContours() 的标志.您可以设置一个名为 CV_RETR_EXTERNAL 的标志,它将只返回最外层的轮廓(它内部的所有轮廓都被丢弃)。这可能会返回整个框架,因此您需要缩小搜索范围,这样它就不会检查您的框架边界。使用函数 copyMakeBorder() 来完成此操作。我还建议删除扩张功能,因为它可能会导致线条两侧出现重复轮廓(如果删除扩张功能,您甚至可能不需要边框)。这是我的输出:
Tôi là một lập trình viên xuất sắc, rất giỏi!