opencv图片矫正
基本操作:图像的翻转(镜像)、平移、旋转、仿射与透视变换(OPENCV C++)
常用图像函数:几个常见的cv函数,cvtcolor、gaussianblur、canny等等
旋转:霍夫线可以实现
仿射:三个点
透视:四个点
自动化透视矫正图像流程:
灰度化二值化
形态学去除噪点
获取轮廓
检测直线
计算直线交点
获取四个透视顶点
透视变换
本项目重点:旋转、透视变换
本项目难点:做透视变换时,由于照片中的表格可能并不完整,提取透视点比较困难
解决方案:拓展线取交点或依文字部分确定框线获取透视顶点(必有检查步骤检查上传的照片完整度,确保所需文字都齐全)
重要方法:
轮廓提取技术
霍夫变换知识
ROI感兴趣区域知识
引用自霍夫线介绍
cv2.HoughLines()
dst: 输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对 (r,\theta) 的容器
rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 设置阈值: 一条直线所需最少的的曲线交点
srn and stn: 参数默认为0
return:返回的是一个包含rho和theta的数组,[rho,theta]
cv2.HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 )
dst: 输出图像. 它应该是个灰度图 (但事实上是个二值化图)
lines: 储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器
rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.
theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)
threshold: 设置阈值: 一条直线所需最少的的曲线交点。超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。
minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.
maxLineGap: 能被认为在一条直线上的两点的最大距离。
return:返回的是含有一条直线的起始点和终点坐标[x1,y1,x2,y2]
注意事项:
image = cv2.imdecode(np.fromfile("D:/斜角度2.jpg", dtype=np.uint8), -1)
resize(img,(x, y))
void cvCanny(
const CvArr* image,
CvArr* edges,
double threshold1,double threshold2,
int aperture_size=3
);
函数说明:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵
引用自findContours函数介绍
findContours( InputOutputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset=Point());
输出contours, hierarchy=findContours()
contours为轮廓点信息,hierarchy为轮廓结构信息
inputarray InputArray类的作用
[不能声明一个InputArray类]
(http://blog.sina.com.cn/s/blog_59fabe030101hvow.html)
1第一个参数image:图像->二值图像(一般是边缘处理过的二值图像)
2第二个参数contours:contours,定义为“vector
contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数,不同轮廓的像素点个数大有不同,
contours<-许多轮廓点<-许多像素点
3第三个参数hierarchy:定义为“vector hierarchy”,先来看一下Vec4i的定义: typedef Vec
4第四个参数 int mode:
5第五个参数:int method:
6第六个参数:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!
drawContours( dstImage, contours, index, color, 1, 8,hierarchy )
approxPolyDP(Mat(contours0[k]), contours[k], 0.1, true)