OpenCV透视变换应用之书本视图矫正+广告屏幕切换_第1页
OpenCV透视变换应用之书本视图矫正+广告屏幕切换_第2页
OpenCV透视变换应用之书本视图矫正+广告屏幕切换_第3页
OpenCV透视变换应用之书本视图矫正+广告屏幕切换_第4页
OpenCV透视变换应用之书本视图矫正+广告屏幕切换_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第OpenCV透视变换应用之书本视图矫正+广告屏幕切换目录一、透视变换的实际应用场景二、案例了解透视变换--书本视图矫正三、案例了解透视变换--广告屏幕切换

一、透视变换的实际应用场景

我们在出门坐车时,经常会看到司机会使用一种行车辅助工具,这其中就使用到了透视变换的相关操作,协助司机安全行车。

可以看出,自身小车周围路况的正常显示,便利了司机的行车操作

像这种透视变换的实际生活应用,其实还有许多,接下来,我们就来学习一下OpenCV的透视变换

二、案例了解透视变换--书本视图矫正

原图:

目标:需要使用透视变换将书桌上的课本正视视角查看

结果展示:

书本视图矫正完整代码如下:【这里是鼠标点击从左上角开始顺时针选取4个点透视变换】

#includeiostream

#includeopencv2/opencv.hpp

#includevector

usingnamespacecv;

usingnamespacestd;

//鼠标操作自己准备结构体

structimagedata

Matimg;//目标图像用于点击确定坐标

vectorPoint2fpoints;//存放原图的坐标通过鼠标的点击进行存放

//鼠标操作的回调函数:用于选择四个角的点(使用方法:从左上角开始顺时针选择四个点,选完之后回车操作)

voidmouseHundle(intevent,intx,inty,intflag,void*arg)

//强制转换

structimagedata*d=(structimagedata*)arg;

//如果按下的是鼠标左键

if(event==EVENT_LBUTTONDOWN)

//用圆形来标记下鼠标按下左键标记的位置

circle(d-img,Point(x,y),3,Scalar(255,0,0),3,CV_AA);//在图上标记,圆心为点击的位置

imshow("image",d-img);//原窗口上进行显示标记点

//透视变换需要使用四个点的坐标

if(d-points.size()4)

d-points.push_back(Point2f(x,y));//把点击下来的坐标进行存储

voidexample_1()

Matimage=imread("D:/00000000000003jieduanshipincailliao/book2.jpg");

Matresult=Mat::zeros(400,500,CV_8UC1);//最终结果显示单通道

//准备坐标:存放四个转换以后的坐标

vectorPoint2f

//坐标一定要相反镜像坐标

obj.push_back(Point2f(0,0));

obj.push_back(Point2f(500,0));

obj.push_back(Point2f(500,400));

obj.push_back(Point2f(0,400));

imshow("image",image);

structimagedatadata;

data.img=image;

//鼠标操作鼠标处理的回调函数

setMouseCallback("image",mouseHundle,data);

//按任意键关闭当前显示的窗口,显示下一个窗口

waitKey(0);

//利用RANSAC算法计算得到转换映射矩阵3*3

Matres=findHomography(data.points,obj,CV_RANSAC);

//查看转换矩阵

//imshow("res",res);

//原图转换出来结果图

warpPerspective(image,result,res,result.size());

//查看转换结果图透视变换

imshow("result",result);

waitKey(0);

intmain(intargc,char*argv[])

example_1();

return0;

}

以上是使用鼠标点击确定坐标,当然,我们也可以在代码中写上选定的坐标进行透视变换的相关操作。依然选取左上角开始顺时针坐标选取,这里以左上角为例,其他三个点可以类比左上角坐标选择来确定下坐标选取

可以看到左上角坐标x=282,y=43

自己定下透视变换使用到的四个坐标直接回车即可查看透视变换结果

//鼠标操作鼠标处理的回调函数

//setMouseCallback("image",mouseHundle,data);

//不使用鼠标点击,自己定下透视变换的四个坐标

vectorPoint2f

src.push_back(Point2f(283,134));

src.push_back(Point2f(745,234));

src.push_back(Point2f(578,463));

src.push_back(Point2f(61,299));

//按任意键关闭当前显示的窗口,显示下一个窗口

waitKey(0);

//利用RANSAC算法计算得到转换映射矩阵3*3

Matres=findHomography(src,obj,CV_RANSAC);

//查看转换矩阵

//imshow("res",res);

程序运行直接回车操作查看

三、案例了解透视变换--广告屏幕切换

背景图片:

想要切换的广告图片:

目标:选择广告屏幕切换广告屏幕内容

结果:广告屏上面的内容推荐成功切换成自己想要切换的广告图片

实现方法:处理后两张图片的叠加,就是先将想要更换的广告屏填充黑色背景图,再将自己想要的广告图片两张图片叠加就能达到切换广告屏幕的效果

广告屏幕切换完整代码如下:

#includeiostream

#includeopencv2/opencv.hpp

usingnamespacecv;

usingnamespacestd;

structimagedata

Matimg;//目标图像

vectorPoint2fpoints;//3D点

//鼠标操作函数:用于选择四个角的点(使用方法有顺序的,从左上角顺时针选择,选完之后回车)

voidmouseHundle(intevent,intx,inty,intflag,void*ptr)

structimagedata*d=(structimagedata*)ptr;

if(event==EVENT_LBUTTONDOWN)

//确定按下的是鼠标左键

//用圆形标记一下鼠标按下左键标记的位置

circle(d-img,Point(x,y),3,Scalar(255,0,0),3,CV_AA);//在图上标记,圆心为点击的位置

imshow("dst",d-img);//在dst背景图中显示鼠标选取的图片

if(d-points.size()4)//只存下来,最先点的前四个点

d-points.push_back(Point2f(x,y));//把鼠标操作点击的点存起来

voidexample_2()

Matimage1=imread("D:/00000000000003jieduanshipincailliao/0802.jpg");//想要切换的广告内容

Matimage2=imread("D:/00000000000003jieduanshipincailliao/city.jpg");//纽约时代广场图片背景

Matdst=image2.clone();//背景图片克隆

//存放原图坐标想要切换的广告屏图片

vectorPoint2f

obj.push_back(Point2f(0,0));

obj.push_back(Point2f(image1.cols,0));

obj.push_back(Point2f(image1.cols,image1.rows));

obj.push_back(Point2f(0,image1.rows));

//纽约时代广场图背景图显示

imshow("dst",dst);

structimagedatadata;

data.img=dst;

//鼠标操作鼠标处理的回调函数

setMouseCallback("dst",mouseHundle,data);

//按任意键关闭当前显示的窗口,显示下一个窗口

waitKey(0);

//计算得到转换映射矩阵3*3原图坐标转换为鼠标选择

Matres=findHomography(obj,data.points,CV_RANSAC);

//imshow("res",res);

//透视变换

warpPerspective(image1,dst,res,dst.size());

//仅有的却换后的广告图图片

//imshow("image1",dst);

Pointpts[4];

for(inti=0;ii++)

pts[i]=data.points[i];

//鼠标点选的四个坐标的区域填充成黑色

fillConvexPoly(image2,pts,4,Scalar(0),C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论