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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用OpenCV做一個AR的小應用

冬至子 ? 來源:技術鋪子 ? 作者:chasenzhang ? 2023-01-18 12:39 ? 次閱讀

前言

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

總體思路

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

1 二維碼檢測

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

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

2 透視變換

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

本項目使用的是透視變換,在OpenCV中,可以通過warpPerspective函數實現,具體的實現可以參考完整的代碼。

3 掩碼mask操作

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

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];//原圖中的四點 ,一個包含三維點(x,y)的數組,其中x、y是浮點型數
  Point2f dstPoints[4];//目標圖中的三點


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

反思改進

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

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

審核編輯:劉清

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

    關注

    24

    文章

    5082

    瀏覽量

    169173
  • OpenGL
    +關注

    關注

    1

    文章

    85

    瀏覽量

    29204
  • OpenCV
    +關注

    關注

    29

    文章

    625

    瀏覽量

    41218
收藏 人收藏

    評論

    相關推薦

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

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

    OpenCV進行基本繪圖_《OpenCV3編程入門》書本配套源

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

    OpenCV進行基本繪圖_OpenCV3編程入門-源碼例程

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

    如何用labview做一個數碼管顯示數字

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

    打火機做一個小坦克

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

    如何用所學的鴻蒙知識做一個小應用

    的視頻應用,說真的,看到這個活動我很開心,又可以所學的鴻蒙知識來做一個小應用了! ? 看了小提示,都是 JS 組件來實現的,當我看到分布式也可以 JS 來寫時,當時覺得 JS 也太強大了,因為之前寫的 Demo 都是
    的頭像 發(fā)表于 10-19 09:23 ?1726次閱讀

    利用OpenCV構建RaspberryPi運動檢測系統(tǒng)

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

    3行代碼做一個WebServer

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

    LDR做一個自動夜燈

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

    DHT11和LCD1602A做一個氣象站

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

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

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

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

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

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

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

    Arduino做一個語音應用程序來打開和關閉警報

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

    opencv-python和opencv樣嗎

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