【发布时间】:2016-05-21 22:04:17
【问题描述】:
我正在尝试检测在图像上绘制的一些矩形(白色)。 (比如使用绘画或其他图像编辑工具)。 由于我是图像处理的初学者,我搜索了网络和 OpenCV 示例程序来完成这项工作,但无法让它完美地工作。我正在使用 OpenCV C++ 库。
我试过的算法
cv::Mat src = cv::imread(argv[1]);
cv::Mat gray;
cv::cvtColor(src, gray, CV_BGR2GRAY);
meanStdDev(gray, mu, sigma);
cv::Mat bw;
cv::Canny(gray, bw, mu.val[0] - sigma.val[0], mu.val[0] + sigma.val[0]);
std::vector<std::vector<cv::Point> > contours;
cv::findContours(bw.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
std::vector<cv::Point> approx;
for (int i = 0; i < contours.size(); i++){
cv::approxPolyDP(cv::Mat(contours[i]), approx, cv::arcLength(cv::Mat(contours[i]), true)*0.02, true);
if (approx.size() >= 4 && approx.size() <= 6)
Rect boundRect = boundingRect( Mat(approx) );
rectangle( dst, boundRect.tl(), boundRect.br(), Scalar(255,255,255), 1, 8, 0 );}
只检测到一个矩形。能否请您指导我或提供相同的链接。
输入图片:
输出图像:
【问题讨论】:
-
什么是
i(例如contours[i])? -
我正在遍历 contours.size(),我已经编辑了我之前的帖子。很抱歉造成混乱。
-
你能
std::cout << contours.size() << std::endl;吗?是否找到多个轮廓?你确定approx.size() <= 6没有过滤掉很多好的轮廓吗?你玩过那个参数吗?请发布示例输入图像。 -
contours.size() 347. 我在帖子中添加了示例输入图像
-
我猜图像中的干扰太多了,所以大多数白色矩形在canny图像中都会有额外的结构。
标签: c++ opencv image-processing