我正在使用此代码尝试查找图像中卡片的边缘。当我运行它时,它只勾勒出一半的卡边缘。
以下是我回来的图片示例。
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));
任何人都可以告诉我如何修改我的代码,以便填补剩下的卡片边缘吗?突出显示的边缘并不总是一致,具体取决于图像,但至少有一半边缘从左侧开始填充。
答案 0 :(得分:3)
你是一个发布此帖的人吗? Automatic perspective correction OpenCV 你正在以一种复杂的方式做所有事情。您的结果应为。看到不同?不在线但在模糊。我猜你刚才没有正确显示你的输出。顺便说一句,您忘记提及输入图像的链接,并显示如何在代码中显示结果。
查看算法的中间输出非常有用。您只需一行代码就可以完成此操作,例如:
imshow("blur", bw);
也不要使用CV_RGB(0,0,64)等颜色值填充单通道灰度图像。动态循环执行此操作可能会导致意外结果。