我一直在尝试找到检测纸张上 4 个黑色方块并使用它们将纸张隔离在其自身图像中的最佳方法。
问问题
4097 次
1 回答
9
看来您的图像上只有 4 个黑色方块,所以您需要做的是:
- 将图像转换为灰度
- 做阈值
- 查找黑色轮廓(在 OpenCV 中执行此操作之前,您必须反转图像,因为默认情况下 OpenCV 会找到白色轮廓)
- 循环遍历这些轮廓并找到边界矩形。
做检查:
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 回答