我正在尝试检测一些类似符号的盒子,并像这样处理后的图像。
我尝试使用形态学方法尝试缩小差距,但差距似乎太大
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);
在这里并不是真的很出乎意料,因为有许多间隙没有闭合,当我尝试执行roxPolyDP时,测试顶点时的轮廓= 4和isContourConvex函数测试失败了(再次在预期范围内)
我只能使用minRectArea强制将整个轮廓变为矩形。
tempCandidate.push_back(cv::minAreaRect(cv::Mat(contours[i])));
它似乎适用于本示例,但我要处理的图像更嘈杂。
如何确定使用miniRectArea包围的区域是矩形?我检查是否使用了满足最小要求的轮廓长度,并且RotatedRect必须具有某些角度,呼吸角度和宽度
我对findContour的使用正确吗?
PS:我不知道该帖子是否构成了太多问题。如果是这样,我会将问题分散到几篇文章中。
预先感谢
答案 0 :(得分:1)
我建议在轮廓图片上使用线检测算法,例如Hough变换。这将为您提供一组线,然后可以在比单个轮廓像素更高的水平上进行分析(例如,通过查看线交叉点的簇等)。
答案 1 :(得分:1)
另一种方法是删除不属于盒子的细线(例如,通过缩小图像,因为线条看起来细了1px,比盒子的边细),然后计算剩余的凸包。参见https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html