您好,登錄后才能下訂單哦!
這篇“OpenCV怎么實現書本視圖矯正和廣告屏幕切換”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“OpenCV怎么實現書本視圖矯正和廣告屏幕切換”文章吧。
我們在出門坐車時,經常會看到司機會使用一種行車輔助工具,這其中就使用到了透視變換的相關操作,協助司機安全行車。
可以看出,自身小車周圍路況的正常顯示,便利了司機的行車操作
像這種透視變換的實際生活應用,其實還有許多,接下來,我們就來學習一下OpenCV的透視變換
原圖:
目標:需要使用透視變換 將書桌上的課本 正視視角查看
結果展示:
書本視圖矯正完整代碼如下:【這里是鼠標點擊從左上角開始順時針選取4個點透視變換】
#include <iostream> #include <opencv2/opencv.hpp> #include<vector> using namespace cv; using namespace std; //鼠標操作 自己準備結構體 struct imagedata { Mat img;//目標圖像 用于點擊 確定坐標 vector<Point2f> points;//存放原圖的坐標 通過鼠標的點擊進行存放 }; //鼠標操作的回調函數:用于選擇四個角的點(使用方法:從左上角開始順時針選擇四個點,選完之后回車操作) void mouseHundle(int event,int x,int y,int flag,void *arg) { //強制轉換 struct imagedata * d = (struct imagedata*)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));//把點擊下來的坐標進行存儲 } } } void example_1() { Mat image=imread("D:/00000000000003jieduanshipincailliao/book2.jpg"); Mat result=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); struct imagedata data; data.img=image; //鼠標操作 鼠標處理的回調函數 setMouseCallback("image",mouseHundle,&data); //按任意鍵關閉當前顯示的窗口,顯示下一個窗口 waitKey(0); //利用RANSAC算法 計算得到轉換映射矩陣3*3 Mat res=findHomography(data.points,obj,CV_RANSAC); //查看轉換矩陣 //imshow("res",res); //原圖轉換出來結果圖 warpPerspective(image,result,res,result.size()); //查看轉換結果圖 透視變換 imshow("result",result); waitKey(0); } int main(int argc, char *argv[]) { example_1(); return 0; }
以上是使用鼠標點擊確定坐標,當然,我們也可以在代碼中寫上選定的坐標進行透視變換的相關操作。 依然選取左上角開始順時針坐標選取,這里以左上角為例,其他三個點可以類比左上角坐標選擇來確定下坐標選取
可以看到左上角坐標 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*3 Mat res=findHomography(src,obj,CV_RANSAC); //查看轉換矩陣 //imshow("res",res);
程序運行 直接回車操作 查看
背景圖片:
想要切換的廣告圖片:
目標:選擇廣告屏幕 切換 廣告屏幕內容
結果:廣告屏上面的 內容推薦 成功切換成自己想要切換的廣告圖片
實現方法:處理后兩張圖片的疊加,就是先將想要更換的廣告屏填充黑色背景圖,再將自己想要的廣告圖片 兩張圖片疊加就能達到切換廣告屏幕的效果
廣告屏幕切換完整代碼如下:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; struct imagedata { Mat img;//目標圖像 vector <Point2f> points;//3D點 }; //鼠標操作函數:用于選擇四個角的點(使用方法有順序的,從左上角順時針選擇,選完之后回車) void mouseHundle(int event,int x,int y,int flag,void *ptr) { struct imagedata * d=(struct imagedata*)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));//把鼠標操作點擊的點存起來 } } } void example_2() { Mat image1=imread("D:/00000000000003jieduanshipincailliao/0802.jpg");//想要切換的廣告內容 Mat image2=imread("D:/00000000000003jieduanshipincailliao/city.jpg");//紐約時代廣場圖片背景 Mat dst=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); struct imagedata data; data.img =dst; //鼠標操作 鼠標處理的回調函數 setMouseCallback("dst",mouseHundle,&data); //按任意鍵關閉當前顯示的窗口,顯示下一個窗口 waitKey(0); //計算得到轉換映射矩陣 3*3 原圖坐標轉換為鼠標選擇 Mat res = findHomography(obj,data.points,CV_RANSAC); //imshow("res",res); //透視變換 warpPerspective(image1,dst,res,dst.size()); //僅有的卻換后的廣告圖圖片 //imshow("image1",dst); Point pts[4]; for(int i=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); } int main(int argc, char *argv[]) { example_2(); return 0; }
以上就是關于“OpenCV怎么實現書本視圖矯正和廣告屏幕切換”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。