0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用OpenCV做一個(gè)AR的小應(yīng)用

冬至子 ? 來源:技術(shù)鋪?zhàn)?/span> ? 作者:chasenzhang ? 2023-01-18 12:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

最近心血來潮,想著用OpenCV做一個(gè)AR的小應(yīng)用,也是看知乎的回答,想到了識(shí)別二維碼,然后在二維碼上放視頻,就花了大概兩三天做出了這個(gè)小demo,完成度大概有70%,這篇文章簡單說明一下。

總體思路

實(shí)現(xiàn)這個(gè)AR demo,首先就是識(shí)別到二維碼,然后根據(jù)二維碼的位置信息,通過透視變換得到一個(gè)區(qū)域,然后用過掩碼的方式,將一段視頻疊加到實(shí)時(shí)場景中。根據(jù)上面所說的,用到的技術(shù)分為三點(diǎn)

1 二維碼檢測

在這個(gè)demo中,只需要檢測二維碼的位置就可以了,所以用的是這個(gè)API,用法也是很簡單的,第一個(gè)參數(shù)為待檢測的圖像,第二個(gè)參數(shù)為二維碼的四個(gè)頂點(diǎn)坐標(biāo),返回值表示是否含有二維碼

bool cv::QRCodeDetector::detect(InputArray img,
                                OutputArray  points)

2 透視變換

得到二維碼的四個(gè)定點(diǎn)之后,隨著視角的移動(dòng),二維碼的四個(gè)定點(diǎn)肯定不是正方形的形狀,這就需要我們疊加的視頻區(qū)“適配”二維碼的視角,這就需要仿射變換和透視變換,

本項(xiàng)目使用的是透視變換,在OpenCV中,可以通過warpPerspective函數(shù)實(shí)現(xiàn),具體的實(shí)現(xiàn)可以參考完整的代碼。

3 掩碼mask操作

得到了放射變換之后的圖,我們還需要把圖片貼上去,這就用到了很常見的mask掩碼操作,就是生成一個(gè)mask圖像,在mask圖像中(一般是灰度圖),只像copy素值不為0的像素點(diǎn),簡單的實(shí)例如下:

dst_warp.copyTo(frame_bg, mask);

完整代碼

#include 
#include 


using namespace cv;
using namespace std;

int main(int argc, char* argv[]) {
    if (argc != 2) {
        std::cout << "eg. " << argv[0] << " video" << std::endl;
        return 0;
    }


    // bg is camera
    VideoCapture cap_bg(2); // 2 is camera index
    // cap_bg.set(CAP_PROP_FRAME_WIDTH, 1280);
    // cap_bg.set(CAP_PROP_FRAME_HEIGHT, 720); 
    VideoCapture cap_show(argv[1]);
    if (!cap_show.isOpened()) {
        std::cout << "open video failed!" << std::endl;
        return 0;
    }


  Point2f srcPoints[4];//原圖中的四點(diǎn) ,一個(gè)包含三維點(diǎn)(x,y)的數(shù)組,其中x、y是浮點(diǎn)型數(shù)
  Point2f dstPoints[4];//目標(biāo)圖中的三點(diǎn)


    Mat frame_bg;
    Mat frame_show;
    Mat dst_warp;
    QRCodeDetector qrcodedetector;
    vector

反思改進(jìn)

1 可以看出來,演示的視頻還是有很多誤檢測的,會(huì)出現(xiàn)一閃一閃的情況,這種情況就需要進(jìn)行濾波,改善閃的情況。

2 其實(shí)AR的最重要一部分就是動(dòng)畫的渲染,這個(gè)demo中只是通過類似于添加logo的方式渲染的,更加專業(yè)的話,其實(shí)是可以用專門的工具進(jìn)行的,比如OpenGL等。

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Ar
    Ar
    +關(guān)注

    關(guān)注

    25

    文章

    5155

    瀏覽量

    172617
  • OpenGL
    +關(guān)注

    關(guān)注

    1

    文章

    86

    瀏覽量

    29854
  • OpenCV
    +關(guān)注

    關(guān)注

    32

    文章

    642

    瀏覽量

    42852
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    在DM8168上移植opencv一個(gè)版本比較好?

    請(qǐng)教下,在DM8168上移植opencv一個(gè)版本比較好?DSP支持opencv的哪個(gè)版本?ubuntu
    發(fā)表于 08-19 07:43

    OpenCV進(jìn)行基本繪圖_《OpenCV3編程入門》書本配套源

    OpenCV3編程入門》書本配套源代碼:OpenCV進(jìn)行基本繪圖
    發(fā)表于 05-11 16:46 ?36次下載

    OpenCV進(jìn)行基本繪圖_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-OpenCV進(jìn)行基本繪圖,感興趣的小伙伴們可以瞧瞧。
    發(fā)表于 09-18 17:02 ?3次下載

    如何用labview做一個(gè)數(shù)碼管顯示數(shù)字

    labview做一個(gè)數(shù)碼管顯示數(shù)字
    發(fā)表于 01-02 19:16 ?113次下載

    打火機(jī)做一個(gè)小坦克

    打火機(jī)大部分由塑料做成,價(jià)格便宜,也沒人回收。因此,我們可以打火機(jī)為材料做一個(gè)簡易的USB LED燈。這個(gè)教程我決定1個(gè)打火機(jī)和USB線來做,它不但可以連接移動(dòng)電源,而且在黑暗中也
    的頭像 發(fā)表于 01-14 17:04 ?8205次閱讀

    如何用所學(xué)的鴻蒙知識(shí)做一個(gè)小應(yīng)用

    的視頻應(yīng)用,說真的,看到這個(gè)活動(dòng)我很開心,又可以所學(xué)的鴻蒙知識(shí)來做一個(gè)小應(yīng)用了! ? 看了小提示,都是 JS 組件來實(shí)現(xiàn)的,當(dāng)我看到分布式也可以 JS 來寫時(shí),當(dāng)時(shí)覺得 JS 也太強(qiáng)大了,因?yàn)橹皩懙?Demo 都是
    的頭像 發(fā)表于 10-19 09:23 ?1975次閱讀

    利用OpenCV構(gòu)建個(gè)RaspberryPi運(yùn)動(dòng)檢測系統(tǒng)

    OpenCV個(gè)強(qiáng)大的工具,結(jié)合RaspberryPi可以打開許多便攜式智能設(shè)備的大門,我們將學(xué)習(xí)如何利用OpenCV的強(qiáng)大功能并在我們的實(shí)時(shí)閉路電視畫面上構(gòu)建
    發(fā)表于 08-01 16:48 ?1619次閱讀
    利用<b class='flag-5'>OpenCV</b>構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>RaspberryPi運(yùn)動(dòng)檢測系統(tǒng)

    3行代碼做一個(gè)WebServer

    電子發(fā)燒友網(wǎng)站提供《3行代碼做一個(gè)WebServer.zip》資料免費(fèi)下載
    發(fā)表于 10-28 16:52 ?0次下載
    <b class='flag-5'>用</b>3行代碼<b class='flag-5'>做一個(gè)</b>WebServer

    LDR做一個(gè)自動(dòng)夜燈

    電子發(fā)燒友網(wǎng)站提供《LDR做一個(gè)自動(dòng)夜燈.zip》資料免費(fèi)下載
    發(fā)表于 10-28 14:21 ?0次下載
    <b class='flag-5'>用</b>LDR<b class='flag-5'>做一個(gè)</b>自動(dòng)夜燈

    DHT11和LCD1602A做一個(gè)氣象站

    電子發(fā)燒友網(wǎng)站提供《DHT11和LCD1602A做一個(gè)氣象站.zip》資料免費(fèi)下載
    發(fā)表于 12-22 15:24 ?0次下載
    <b class='flag-5'>用</b>DHT11和LCD1602A<b class='flag-5'>做一個(gè)</b>氣象站

    OpenCV常用的 7 個(gè)示例(Python版)1

    OpenCV是計(jì)算機(jī)視覺領(lǐng)域最流行的庫之。它最初是 C 和 C++ 編寫的?,F(xiàn)在也可以在 Python 中使用。它最初是由英特爾開發(fā)的。該庫是
    的頭像 發(fā)表于 02-07 16:23 ?1375次閱讀

    OpenCV常用的 7 個(gè)示例(Python版)2

    OpenCV是計(jì)算機(jī)視覺領(lǐng)域最流行的庫之。它最初是 C 和 C++ 編寫的?,F(xiàn)在也可以在 Python 中使用。它最初是由英特爾開發(fā)的。該庫是
    的頭像 發(fā)表于 02-07 16:23 ?1247次閱讀

    OpenCV常用的 7 個(gè)示例(Python版)3

    OpenCV是計(jì)算機(jī)視覺領(lǐng)域最流行的庫之。它最初是 C 和 C++ 編寫的?,F(xiàn)在也可以在 Python 中使用。它最初是由英特爾開發(fā)的。該庫是
    的頭像 發(fā)表于 02-07 16:23 ?1415次閱讀

    Arduino做一個(gè)語音應(yīng)用程序來打開和關(guān)閉警報(bào)

    電子發(fā)燒友網(wǎng)站提供《Arduino做一個(gè)語音應(yīng)用程序來打開和關(guān)閉警報(bào).zip》資料免費(fèi)下載
    發(fā)表于 07-10 10:46 ?0次下載
    <b class='flag-5'>用</b>Arduino<b class='flag-5'>做一個(gè)</b>語音應(yīng)用程序來打開和關(guān)閉警報(bào)

    opencv-python和opencv樣嗎

    樣。OpenCV(Open Source Computer Vision Library)是個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,它提供了大量的圖像和視頻處理功能。
    的頭像 發(fā)表于 07-16 10:38 ?2079次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品