7

我一直在尝试找到检测纸张上 4 个黑色方块并使用它们将纸张隔离在其自身图像中的最佳方法。

在此处输入图像描述

4

1 回答 1

9

看来您的图像上只有 4 个黑色方块,所以您需要做的是:

  1. 将图像转换为灰度
  2. 做阈值
  3. 查找黑色轮廓(在 OpenCV 中执行此操作之前,您必须反转图像,因为默认情况下 OpenCV 会找到白色轮廓)
  4. 循环遍历这些轮廓并找到边界矩形。
  5. 做检查:

    A)矩形的面积大于某个常数(在我的解决方案中是100

    B)矩形的宽度/高度接近 1.0(在我看来它是[0.9, 1.1]范围)

编码:

Mat img = imread("test.jpg"), gray;
vector<Vec4i> hierarchy;
vector<vector<Point2i> > contours;
cvtColor(img, gray, CV_BGR2GRAY);
threshold(gray, gray, 100, 255, THRESH_BINARY);
bitwise_not(gray, gray);

findContours(gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

for(size_t i=0; i<contours.size(); i++)
{
    Rect rect = boundingRect(contours[i]);
    double k = (rect.height+0.0)/rect.width;
    if (0.9<k && k<1.1 && rect.area()>100)
    {
        drawContours(img, contours, i, Scalar(0,0,255));
    }
}

imshow("result", img);
waitKey();

结果: 在此处输入图像描述

另请阅读此 SO 讨论- 您不需要 4 个方格来检测纸张。

于 2012-07-18T07:10:43.653 回答