RM新时代网站-首页

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

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

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

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

冬至子 ? 來源:技術(shù)鋪?zhàn)?/span> ? 作者:chasenzhang ? 2023-01-18 12:39 ? 次閱讀

前言

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

總體思路

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

1 二維碼檢測

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

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

2 透視變換

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

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

3 掩碼mask操作

得到了放射變換之后的圖,我們還需要把圖片貼上去,這就用到了很常見的mask掩碼操作,就是生成一個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) ,一個包含三維點(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 可以看出來,演示的視頻還是有很多誤檢測的,會出現(xiàn)一閃一閃的情況,這種情況就需要進(jìn)行濾波,改善閃的情況。

2 其實(shí)AR的最重要一部分就是動畫的渲染,這個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ī)問題,請聯(lián)系本站處理。 舉報投訴
  • Ar
    Ar
    +關(guān)注

    關(guān)注

    24

    文章

    5095

    瀏覽量

    169466
  • OpenGL
    +關(guān)注

    關(guān)注

    1

    文章

    85

    瀏覽量

    29243
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    634

    瀏覽量

    41337
收藏 人收藏

    評論

    相關(guān)推薦

    在DM8168上移植opencv一個版本比較好?

    請教下,在DM8168上移植opencv一個版本比較好?DSP支持opencv的哪個版本?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做一個數(shù)碼管顯示數(shù)字

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

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

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

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

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

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

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

    3行代碼做一個WebServer

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

    LDR做一個自動夜燈

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

    DHT11和LCD1602A做一個氣象站

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

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

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

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

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

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

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

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

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

    opencv-python和opencv樣嗎

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