最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV透視變換應(yīng)用之書(shū)本視圖矯正+廣告屏幕切換

 更新時(shí)間:2022年08月03日 15:42:12   作者:我今年十六歲  
透視變換是指利用透視中心、像點(diǎn)、目標(biāo)點(diǎn)三點(diǎn)共線(xiàn)的條件,按透視旋轉(zhuǎn)定律使承影面繞跡線(xiàn)旋轉(zhuǎn)某一角度,破壞原有的投影光線(xiàn)束,仍能保持承影面上投影幾何圖形不變的變換。本文將為大家介紹兩個(gè)OpenCV透視變換應(yīng)用,需要的可以參考一下

一、透視變換的實(shí)際應(yīng)用場(chǎng)景

我們?cè)诔鲩T(mén)坐車(chē)時(shí),經(jīng)常會(huì)看到司機(jī)會(huì)使用一種行車(chē)輔助工具,這其中就使用到了透視變換的相關(guān)操作,協(xié)助司機(jī)安全行車(chē)。

可以看出,自身小車(chē)周?chē)窙r的正常顯示,便利了司機(jī)的行車(chē)操作 

像這種透視變換的實(shí)際生活應(yīng)用,其實(shí)還有許多,接下來(lái),我們就來(lái)學(xué)習(xí)一下OpenCV的透視變換

二、案例了解透視變換--書(shū)本視圖矯正

原圖:

目標(biāo):需要使用透視變換 將書(shū)桌上的課本 正視視角查看

結(jié)果展示:

書(shū)本視圖矯正完整代碼如下:【這里是鼠標(biāo)點(diǎn)擊從左上角開(kāi)始順時(shí)針選取4個(gè)點(diǎn)透視變換】

#include <iostream>
#include <opencv2/opencv.hpp>
#include<vector>
using namespace cv;
using namespace std;
 
//鼠標(biāo)操作 自己準(zhǔn)備結(jié)構(gòu)體
struct imagedata
{
    Mat img;//目標(biāo)圖像 用于點(diǎn)擊 確定坐標(biāo)
    vector<Point2f> points;//存放原圖的坐標(biāo) 通過(guò)鼠標(biāo)的點(diǎn)擊進(jìn)行存放
};
 
//鼠標(biāo)操作的回調(diào)函數(shù):用于選擇四個(gè)角的點(diǎn)(使用方法:從左上角開(kāi)始順時(shí)針選擇四個(gè)點(diǎn),選完之后回車(chē)操作)
void mouseHundle(int event,int x,int y,int flag,void *arg)
{
    //強(qiáng)制轉(zhuǎn)換
    struct imagedata * d = (struct imagedata*)arg;
    //如果按下的是鼠標(biāo)左鍵
    if(event==EVENT_LBUTTONDOWN)
    {
        //用圓形來(lái)標(biāo)記下鼠標(biāo)按下左鍵標(biāo)記的位置
        circle(d->img,Point(x,y),3,Scalar(255,0,0),3,CV_AA);//在圖上標(biāo)記,圓心為點(diǎn)擊的位置
        imshow("image",d->img);//原窗口上進(jìn)行顯示標(biāo)記點(diǎn)
        //透視變換 需要使用四個(gè)點(diǎn)的坐標(biāo)
        if(d->points.size()<4)
        {
            d->points.push_back(Point2f(x,y));//把點(diǎn)擊下來(lái)的坐標(biāo)進(jìn)行存儲(chǔ)
        }
    }
}
 
void example_1()
{
    Mat image=imread("D:/00000000000003jieduanshipincailliao/book2.jpg");
    Mat result=Mat::zeros(400,500,CV_8UC1);//最終結(jié)果顯示 單通道
 
    //準(zhǔn)備坐標(biāo):存放四個(gè)轉(zhuǎn)換以后的坐標(biāo)
    vector<Point2f>obj;
    //坐標(biāo)一定要相反 鏡像坐標(biāo)
    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;
 
    //鼠標(biāo)操作  鼠標(biāo)處理的回調(diào)函數(shù)
    setMouseCallback("image",mouseHundle,&data);
 
    //按任意鍵關(guān)閉當(dāng)前顯示的窗口,顯示下一個(gè)窗口
    waitKey(0);
 
    //利用RANSAC算法  計(jì)算得到轉(zhuǎn)換映射矩陣3*3
    Mat res=findHomography(data.points,obj,CV_RANSAC);
    //查看轉(zhuǎn)換矩陣
    //imshow("res",res);
 
    //原圖轉(zhuǎn)換出來(lái)結(jié)果圖
    warpPerspective(image,result,res,result.size());
    //查看轉(zhuǎn)換結(jié)果圖 透視變換
    imshow("result",result);
 
    waitKey(0);
}
 
int main(int argc, char *argv[])
{
    example_1();
    return 0;
}

以上是使用鼠標(biāo)點(diǎn)擊確定坐標(biāo),當(dāng)然,我們也可以在代碼中寫(xiě)上選定的坐標(biāo)進(jìn)行透視變換的相關(guān)操作。 依然選取左上角開(kāi)始順時(shí)針坐標(biāo)選取,這里以左上角為例,其他三個(gè)點(diǎn)可以類(lèi)比左上角坐標(biāo)選擇來(lái)確定下坐標(biāo)選取

可以看到左上角坐標(biāo) x=282,y=43

自己定下透視變換使用到的四個(gè)坐標(biāo) 直接回車(chē) 即可查看透視變換結(jié)果

    //鼠標(biāo)操作  鼠標(biāo)處理的回調(diào)函數(shù)
    //setMouseCallback("image",mouseHundle,&data);
 
    //不使用鼠標(biāo)點(diǎn)擊,自己定下透視變換的四個(gè)坐標(biāo)
    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));
 
    //按任意鍵關(guān)閉當(dāng)前顯示的窗口,顯示下一個(gè)窗口
    waitKey(0);
 
    //利用RANSAC算法  計(jì)算得到轉(zhuǎn)換映射矩陣3*3
    Mat res=findHomography(src,obj,CV_RANSAC);
    //查看轉(zhuǎn)換矩陣
    //imshow("res",res);

程序運(yùn)行 直接回車(chē)操作 查看

三、案例了解透視變換--廣告屏幕切換

背景圖片: 

想要切換的廣告圖片: 

目標(biāo):選擇廣告屏幕 切換 廣告屏幕內(nèi)容

結(jié)果:廣告屏上面的 內(nèi)容推薦 成功切換成自己想要切換的廣告圖片

實(shí)現(xiàn)方法:處理后兩張圖片的疊加,就是先將想要更換的廣告屏填充黑色背景圖,再將自己想要的廣告圖片 兩張圖片疊加就能達(dá)到切換廣告屏幕的效果

廣告屏幕切換完整代碼如下:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
 
struct imagedata
{
    Mat img;//目標(biāo)圖像
    vector <Point2f> points;//3D點(diǎn)
};
 
//鼠標(biāo)操作函數(shù):用于選擇四個(gè)角的點(diǎn)(使用方法有順序的,從左上角順時(shí)針選擇,選完之后回車(chē))
void mouseHundle(int event,int x,int y,int flag,void *ptr)
{
    struct imagedata * d=(struct imagedata*)ptr;
    if(event==EVENT_LBUTTONDOWN)
    {
        //確定按下的是鼠標(biāo)左鍵
        //用圓形標(biāo)記一下鼠標(biāo)按下左鍵標(biāo)記的位置
        circle(d->img,Point(x,y),3,Scalar(255,0,0),3,CV_AA);//在圖上標(biāo)記,圓心為點(diǎn)擊的位置
 
        imshow("dst",d->img);//在dst背景圖中顯示鼠標(biāo)選取的圖片
 
        if(d->points.size()<4)//只存下來(lái),最先點(diǎn)的前四個(gè)點(diǎn)
        {
            d->points.push_back(Point2f(x,y));//把鼠標(biāo)操作點(diǎn)擊的點(diǎn)存起來(lái)
        }
    }
}
 
void example_2()
{
    Mat image1=imread("D:/00000000000003jieduanshipincailliao/0802.jpg");//想要切換的廣告內(nèi)容
    Mat image2=imread("D:/00000000000003jieduanshipincailliao/city.jpg");//紐約時(shí)代廣場(chǎng)圖片背景
 
    Mat dst=image2.clone();//背景圖片 克隆
 
    //存放原圖坐標(biāo) 想要切換的廣告屏圖片
    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));
 
    //紐約時(shí)代廣場(chǎng)圖背景圖顯示
    imshow("dst",dst);
    struct imagedata data;
    data.img =dst;
 
    //鼠標(biāo)操作 鼠標(biāo)處理的回調(diào)函數(shù)
    setMouseCallback("dst",mouseHundle,&data);
    //按任意鍵關(guān)閉當(dāng)前顯示的窗口,顯示下一個(gè)窗口
    waitKey(0);
 
    //計(jì)算得到轉(zhuǎn)換映射矩陣 3*3  原圖坐標(biāo)轉(zhuǎn)換為鼠標(biāo)選擇
    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];
    }
    //鼠標(biāo)點(diǎn)選的四個(gè)坐標(biāo)的區(qū)域填充成黑色
    fillConvexPoly(image2,pts,4,Scalar(0),CV_AA);
    //imshow("image2",image2);
 
    //將僅有的卻換后的廣告圖圖片 和  鼠標(biāo)點(diǎn)選的四個(gè)坐標(biāo)的區(qū)域填充成黑色的背景圖圖片 疊加
    image2+=dst;
    //顯示出最后廣告換屏結(jié)果圖片
    imshow("final",image2);
 
    waitKey(0);
}
 
int main(int argc, char *argv[])
{
    example_2();
    return 0;
}

到此這篇關(guān)于OpenCV透視變換應(yīng)用之書(shū)本視圖矯正+廣告屏幕切換的文章就介紹到這了,更多相關(guān)OpenCV透視變換應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言malloc分配問(wèn)題詳解

    C語(yǔ)言malloc分配問(wèn)題詳解

    這篇文章主要介紹了c語(yǔ)言 malloc函數(shù)的分配問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • strcat 函數(shù)的使用指南

    strcat 函數(shù)的使用指南

    strcat是連接字符串的函數(shù)。函數(shù)返回指針,兩個(gè)參數(shù)都是指針,第一個(gè)參數(shù)所指向的內(nèi)存的地址必須能容納兩個(gè)字符串連接后的大小。
    2015-09-09
  • C++中的動(dòng)態(tài)規(guī)劃子序列問(wèn)題分析探討

    C++中的動(dòng)態(tài)規(guī)劃子序列問(wèn)題分析探討

    可能有些讀者有接觸過(guò)動(dòng)態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動(dòng)態(tài)規(guī)劃這個(gè)東西,別擔(dān)心,我這篇文章會(huì)為讀者做一個(gè)入門(mén),好讓讀者掌握這個(gè)重要的知識(shí)點(diǎn)
    2023-03-03
  • 深入分析為Visual Assist設(shè)置快捷鍵的方法

    深入分析為Visual Assist設(shè)置快捷鍵的方法

    本篇文章是對(duì)為Visual Assist設(shè)置快捷鍵的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言、C++中的union用法總結(jié)

    C語(yǔ)言、C++中的union用法總結(jié)

    這篇文章主要介紹了C語(yǔ)言、C++中的union用法總結(jié),本文講解了什么是union、C中使用union、當(dāng)union遇到對(duì)象等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C++變量初始化形式及其默認(rèn)初始值問(wèn)題

    C++變量初始化形式及其默認(rèn)初始值問(wèn)題

    這篇文章主要介紹了C++變量初始化形式及其默認(rèn)初始值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++17中std::string_view的使用

    C++17中std::string_view的使用

    std::string_view是C++17標(biāo)準(zhǔn)庫(kù)中的一種新類(lèi)型,它提供了對(duì)一個(gè)字符序列的非擁有式視圖,本文主要介紹了C++17中std::string_view的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò)

    C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 詳解C語(yǔ)言中的fopen()函數(shù)和fdopen()函數(shù)

    詳解C語(yǔ)言中的fopen()函數(shù)和fdopen()函數(shù)

    這篇文章主要介紹了詳解C語(yǔ)言中的fopen()函數(shù)和fdopen()函數(shù),注意其之間指針功能相關(guān)的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)

    C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)

    這篇文章主要介紹了C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

来凤县| 浑源县| 团风县| 珠海市| 云阳县| 子长县| 昌宁县| 永仁县| 余干县| 巨鹿县| 绥阳县| 屏东县| 邛崃市| 安岳县| 衡东县| 琼海市| 博客| 五常市| 雅江县| 宜章县| 屏东市| 西乡县| 崇义县| 应用必备| 连平县| 芦山县| 哈尔滨市| 黎川县| 金山区| 凌源市| 彰化县| 静海县| 阆中市| 兴海县| 万源市| 汽车| 泽库县| 乌拉特前旗| 广德县| 永和县| 吉水县|