OpenCV泛洪填充卡边缘

时间:2014-03-20 05:54:57

标签: c++ opencv

我正在使用此代码尝试查找图像中卡片的边缘。当我运行它时,它只勾勒出一半的卡边缘。

以下是我回来的图片示例。

enter image description here

cvtColor(Img, bw, CV_RGB2GRAY);
Mat outerBox = Mat(bw.size(), CV_8UC1);
GaussianBlur(bw, bw, cv::Size(11,11), 0);
adaptiveThreshold(bw, outerBox, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 5, 2);
bitwise_not(outerBox, outerBox);
Mat kernel = (Mat_<uchar>(3,3) << 0,1,0,1,1,1,0,1,0);
dilate(outerBox, outerBox, kernel);

int count=0;
int max=-1;
cv::Point maxPt;

for(int y=0;y<outerBox.size().height;y++)
{
    uchar *row = outerBox.ptr(y);
    for(int x=0;x<outerBox.size().width;x++)
    {
        if(row[x]>=128)
        {
            int area = floodFill(outerBox, cv::Point(x,y), CV_RGB(0,0,64));

            if(area>max)
            {
                maxPt = cv::Point(x,y);
                max = area;
            }
        }
    }
}
floodFill(outerBox, maxPt, CV_RGB(255,255,255));

有问题的代码行是floodFill(outerBox, maxPt, CV_RGB(255,255,255));

任何人都可以告诉我如何修改我的代码,以便填补剩下的卡片边缘吗?突出显示的边缘并不总是一致,具体取决于图像,但至少有一半边缘从左侧开始填充。

1 个答案:

答案 0 :(得分:3)

你是一个发布此帖的人吗? Automatic perspective correction OpenCV 你正在以一种复杂的方式做所有事情。您的结果应为enter image description here。看到不同?不在线但在模糊。我猜你刚才没有正确显示你的输出。顺便说一句,您忘记提及输入图像的链接,并显示如何在代码中显示结果。

查看算法的中间输出非常有用。您只需一行代码就可以完成此操作,例如:

imshow("blur", bw);

也不要使用CV_RGB(0,0,64)等颜色值填充单通道灰度图像。动态循环执行此操作可能会导致意外结果。