OpenCV怎么实现书本视图矫正和广告屏幕切换
导读:本文共4601字符,通常情况下阅读需要15分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:这篇“OpenCV怎么实现书本视图矫正和广告屏幕切换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV怎么实现书本视图矫正和广告屏幕切换”文章吧。一、透视变换的实际应用场景我们在出门坐车时,经常会看到司机会使用一种行车辅助工具,这其中就使用到了透视变换的相关操作,协助司机安全... ...
目录
(为您整理了一些要点),点击可以直达。这篇“OpenCV怎么实现书本视图矫正和广告屏幕切换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV怎么实现书本视图矫正和广告屏幕切换”文章吧。
一、透视变换的实际应用场景
我们在出门坐车时,经常会看到司机会使用一种行车辅助工具,这其中就使用到了透视变换的相关操作,协助司机安全行车。
可以看出,自身小车周围路况的正常显示,便利了司机的行车操作
像这种透视变换的实际生活应用,其实还有许多,接下来,我们就来学习一下OpenCV的透视变换
二、案例了解透视变换--书本视图矫正
原图:
目标:需要使用透视变换 将书桌上的课本 正视视角查看
结果展示:
书本视图矫正完整代码如下:【这里是鼠标点击从左上角开始顺时针选取4个点透视变换】
#include<iostream>#include<opencv2/opencv.hpp>#include<vector>usingnamespacecv;usingnamespacestd;//鼠标操作自己准备结构体structimagedata{Matimg;//目标图像用于点击确定坐标vector<Point2f>points;//存放原图的坐标通过鼠标的点击进行存放};//鼠标操作的回调函数:用于选择四个角的点(使用方法:从左上角开始顺时针选择四个点,选完之后回车操作)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);//最终结果显示单通道//准备坐标:存放四个转换以后的坐标vector<Point2f>obj;//坐标一定要相反镜像坐标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*3Matres=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);//不使用鼠标点击,自己定下透视变换的四个坐标vector<Point2f>src;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*3Matres=findHomography(src,obj,CV_RANSAC);//查看转换矩阵//imshow("res",res);
程序运行 直接回车操作 查看
三、案例了解透视变换--广告屏幕切换
背景图片:
想要切换的广告图片:
目标:选择广告屏幕 切换 广告屏幕内容
结果:广告屏上面的 内容推荐 成功切换成自己想要切换的广告图片
实现方法:处理后两张图片的叠加,就是先将想要更换的广告屏填充黑色背景图,再将自己想要的广告图片 两张图片叠加就能达到切换广告屏幕的效果
广告屏幕切换完整代码如下:
#include<iostream>#include<opencv2/opencv.hpp>usingnamespacecv;usingnamespacestd;structimagedata{Matimg;//目标图像vector<Point2f>points;//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();//背景图片克隆//存放原图坐标想要切换的广告屏图片vector<Point2f>obj;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;i<4;i++){pts[i]=data.points[i];}//鼠标点选的四个坐标的区域填充成黑色fillConvexPoly(image2,pts,4,Scalar(0),CV_AA);//imshow("image2",image2);//将仅有的却换后的广告图图片和鼠标点选的四个坐标的区域填充成黑色的背景图图片叠加image2+=dst;//显示出最后广告换屏结果图片imshow("final",image2);waitKey(0);}intmain(intargc,char*argv[]){example_2();return0;}
以上就是关于“OpenCV怎么实现书本视图矫正和广告屏幕切换”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
OpenCV怎么实现书本视图矫正和广告屏幕切换的详细内容,希望对您有所帮助,信息来源于网络。