第
OpenCV通过透视变换实现矫正图像详解
5.轮廓发现
6.使用霍夫直线检测,检测上下左右四条直线(有可能是多条,但是无所谓)
7.绘制出直线
8.寻找与定位上下左右是条直线
9.拟合四条直线方程
10.计算四条直线的交点,ps:这四个交点其实就是我们最终要寻找的,用于透视变换使用的
11.进行透视变换
12.输出透视变换的结果
说明:
解释一下为啥是上面那些步骤。
1.其实我们的最终目的是通过透视矩阵getPerspectiveTransform+透视变换warpPerspective来完成图像的矫正
2.但是getPerspectiveTransform需要两个参数,输入矩阵参数和目标矩阵参数。
3.由于输入矩阵参数就是原图像是个角的顶点,由于我们没有所以要求出来
4.所以我们以上的所有步骤都是为11、12步打基础的
ps:核心就是利用透视矩阵做透视变换
重点:
1.直线方程y=kx+c
2.如果两条直线有交点,则必有k1x1+c1=k2x2+c2
2、代码演示
//【1】载入图像
Matsrc=imread(filePath);
if(src.empty()){
qDebug()图片为空
return;
imshow(src,src);
//【2】图像灰度化
Matgray;
cvtColor(src,gray,COLOR_BGR2GRAY);
//【3】执行二值分割
threshold(gray,gray,0,255,THRESH_BINARY_INV|THRESH_OTSU);
imshow(threshold,gray);
//【4】执行形态学开操作去除图像中的造点
Matkernel=getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
morphologyEx(gray,gray,MORPH_CLOSE,kernel,Point(-1,-1),3);
imshow(morphologyEx,gray);
//【5】轮廓发现
bitwise_not(gray,gray);
imshow(bitwise_not,gray);
vectorvectorPointcontours;
vectorVec4ihier;
RNGrng(12345);
findContours(gray,contours,hier,RETR_TREE,CHAIN_APPROX_SIMPLE);
MatcolorImage=Mat::zeros(gray.size(),CV_8UC3);
for(size_ti=0;icontours.size();i++){
Rectrect=boundingRect(contours[i]);
//过滤目标轮廓
if(rect.widthsrc.cols-5rect.heightsrc.rows-5rect.widthsrc.cols/2){
drawContours(colorImage,contours,i,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1);
imshow(findContours,colorImage);
//【6】使用霍夫直线检测
vectorVec4ilines;
cvtColor(colorImage,colorImage,COLOR_BGR2GRAY);
kernel=getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
dilate(colorImage,colorImage,kernel,Point(-1,-1),1);
imshow(colorImage_gray,colorImage);
intaccu=min(src.cols*0.5,src.rows*0.5);
HoughLinesP(colorImage,lines,1,CV_PI/180,accu,accu,0);
//【7】绘制出直线
MatlineColorImage=Mat::zeros(gray.size(