基本信息
文件名称:OpenCV通过透视变换实现矫正图像详解.docx
文件大小:16.55 KB
总页数:4 页
更新时间:2025-05-30
总字数:约2.29千字
文档摘要

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(