如何检测不连续的矩形

时间:2018-11-09 08:00:14

标签: c++ opencv image-processing

我正在尝试检测一些类似符号的盒子,并像这样处理后的图像。

preprocessed image

我尝试使用形态学方法尝试缩小差距,但差距似乎太大

 cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5,5));
 cv::morphologyEx(frame, frame, cv::MORPH_DILATE, element);
 cv::morphologyEx(frame, frame, cv::MORPH_ERODE, element);

使用findcontour后,图片看起来像这样

std::vector<std::vector<cv::Point> > contours;
std::vector< cv::Vec4i > hierarchy;

cv::findContours(frame, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);

contour

在这里并不是真的很出乎意料,因为有许多间隙没有闭合,当我尝试执行roxPolyDP时,测试顶点时的轮廓= 4和isContourConvex函数测试失败了(再次在预期范围内)

我只能使用minRectArea强制将整个轮廓变为矩形。

 tempCandidate.push_back(cv::minAreaRect(cv::Mat(contours[i])));

它似乎适用于本示例,但我要处理的图像更嘈杂。

  1. 我还可以采取什么其他预处理策略来关闭边界?
  2. 如何确定使用miniRectArea包围的区域是矩形?我检查是否使用了满足最小要求的轮廓长度,并且RotatedRect必须具有某些角度,呼吸角度和宽度

  3. 我对findContour的使用正确吗?

PS:我不知道该帖子是否构成了太多问题。如果是这样,我会将问题分散到几篇文章中。

预先感谢

2 个答案:

答案 0 :(得分:1)

我建议在轮廓图片上使用线检测算法,例如Hough变换。这将为您提供一组线,然后可以在比单个轮廓像素更高的水平上进行分析(例如,通过查看线交叉点的簇等)。

答案 1 :(得分:1)

另一种方法是删除不属于盒子的细线(例如,通过缩小图像,因为线条看起来细了1px,比盒子的边细),然后计算剩余的凸包。参见https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html