Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 应用透视变换校正图像中纸张的度数_Opencv_Image Processing_Computer Vision_Detection - Fatal编程技术网

Opencv 应用透视变换校正图像中纸张的度数

Opencv 应用透视变换校正图像中纸张的度数,opencv,image-processing,computer-vision,detection,Opencv,Image Processing,Computer Vision,Detection,我正在做一个项目,它将帮助我们纠正图像的方向度 在此代码中,我检测到一张纸。 我使用的步骤 1.应用houghLine变换 2.检测角点。 3.应用透视变换。 有了这些,我可以探测到一张纸,但它只对一到两张图像有效,对所有图像无效,我不明白为什么 我认为在这段代码中的问题是,它无法正确地检测角点,因此我无法纠正图像的透视 它在这个图像上起作用 但是当我用其他的图像来代替这个时,我就不能这样做了 #包括 #包括 使用名称空间std; 使用名称空间cv; 点2f中心(0,0); 点2F计算机接口

我正在做一个项目,它将帮助我们纠正图像的方向度

在此代码中,我检测到一张纸。 我使用的步骤 1.应用houghLine变换 2.检测角点。 3.应用透视变换。 有了这些,我可以探测到一张纸,但它只对一到两张图像有效,对所有图像无效,我不明白为什么

我认为在这段代码中的问题是,它无法正确地检测角点,因此我无法纠正图像的透视

它在这个图像上起作用

但是当我用其他的图像来代替这个时,我就不能这样做了

#包括
#包括
使用名称空间std;
使用名称空间cv;
点2f中心(0,0);
点2F计算机接口(Vec4i a、Vec4i b)
{
int x1=a[0],y1=a[1],x2=a[2],y2=a[3],x3=b[0],y3=b[1],x4=b[2],y4=b[3];
浮点数;
如果(浮点d=((浮点)(x1-x2)*(y3-y4))-((y1-y2)*(x3-x4)))
{
点2f pt;
第x部分=((x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4))/d;
第y部分=((x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4))/d;
返回pt;
}
其他的
返回点2f(-1,-1);
}
无效分拣角(矢量和角点,点2F中心)
{
矢量陀螺;
对于(int i=0;itop[1]。x?top[1]:top[0];
点2f tr=top[0]。x>top[1]。x?top[0]:top[1];
Point2f bl=bot[0]。x>bot[1]。x?bot[1]:bot[0];
Point2f br=bot[0]。x>bot[1]。x?bot[0]:bot[1];
角落。推回(tl);
角落。推回(tr);
角落。推回(br);
角落。推回(bl);
}
}
int main()
{
Mat src、cann、hsv;
src=imread(“C:\\im.jpg”,窗口自动调整大小);
if(src.empty())
返回-1;
imshow(“原件”,src);
模糊(src,src,大小(3,3));
Canny(src,cann,50,200,3);
CVT颜色(cann、hsv、CV_GRAY2BGR);
矢量线;
HoughLinesP(cann,lines,1,CV_PI/180,70,30,10);
对于(size_t i=0;i=0&&pt.y>=0)
角落。推回(pt);
}
}
向量近似;
近似聚合度(垫(角),近似值,弧长(垫(角),真值)*0.02,真值);
//如果(大约尺寸()!=4)
//  {

//cout您的算法假设HoughLinesP函数始终只检测4行,并且每一行位于纸张的不同边缘。但是,这种假设是错误的。在您的特定情况下,当处理第二张图像时,当处理第二张图像时,它返回5行

快速修复

我更改了第6个HoughLinesP参数(minLineThreshold参数)的值到70。之后,在图像中只检测到四条线,但出现了另一个错误;检测到的是5个角,而不是4个角。原因是?两条相对的边不平行,它们在图像区域外相交很远。这种情况导致了问题:

if (pt.x >= 0 && pt.y >= 0)
            corners.push_back(pt);
仅检查角点坐标是否为非负是不够的。相反,您必须确保角点位于某些有意义的边界内;在您的情况下,这些可能是图像的边界

if (pt.x >= 0 && pt.y >= 0 && pt.x <src.cols && pt.y < src.rows)
            corners.push_back(pt);

如果(pt.x>=0&&pt.y>=0&&pt.x您的算法假设HoughLinesP函数始终只检测4行,并且每一行位于纸张的不同边缘。但是,这种假设是错误的。在您的特定情况下,当处理第二个图像时,当处理第二个图像时,它返回5行

快速修复

我更改了第6个HoughLinesP参数(minLineThreshold参数)的值到70。之后,在图像中只检测到四条线,但出现了另一个错误;检测到的是5个角,而不是4个角。原因是?两条相对的边不平行,它们在图像区域外相交很远。这种情况导致了问题:

if (pt.x >= 0 && pt.y >= 0)
            corners.push_back(pt);
仅检查角点坐标是否为非负是不够的。相反,您必须确保角点位于某些有意义的边界内;在您的情况下,这些可能是图像的边界

if (pt.x >= 0 && pt.y >= 0 && pt.x <src.cols && pt.y < src.rows)
            corners.push_back(pt);

如果(pt.x>=0&&pt.y>=0&&pt.x)可能重复的纸张是否始终为白色和/或比背景亮?纸张是否始终与图像的轴大致对齐?是否必须使用OpenCV,或者是否可以编写自定义算法?您可能会看到桶形失真的问题()和/或起皱的纸张,在这种情况下,边缘将不笔直。这对Hough来说是个问题。在更简单的情况下,可以通过自定义累加器来解决,以允许粗糙或略微弯曲的线条。根据您的完整图像集,将有其他方法来解决此问题。对于理想情况,纸张将始终为白色(现在是这样),没有不同对齐方式的纸张,我在OpenCVW中实现了这一点