国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

V4L2+QT+USB攝像頭實(shí)時顯示視頻(Arm,Linux,window均適用)

這篇具有很好參考價值的文章主要介紹了V4L2+QT+USB攝像頭實(shí)時顯示視頻(Arm,Linux,window均適用)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

寫在開頭

筆者自從學(xué)習(xí)了Framebuffer編程和V4L2編程之后,就想實(shí)現(xiàn)在LCD屏上顯示實(shí)時視頻

筆者學(xué)習(xí)過正點(diǎn)I.MX6U Linux C編程中的相關(guān)內(nèi)容,然而原子的例程是針對OV5640攝像頭寫的,像素格式是RGB

然而USB攝像頭大多支持MJPEG或者YUYV格式,如果要在屏幕上顯示需要進(jìn)行格式轉(zhuǎn)換,而轉(zhuǎn)換像素格式是需要處理時間的,自然會影響視頻幀率

筆者嘗試寫過YUYV2RGB888或者YUYV2RGB565,實(shí)際跑起來能明顯感受到掉幀;
同時,筆者也考慮通過OpenCV來對JPEG或者YUYV進(jìn)行編解碼來顯示,然而實(shí)際效果也不盡如人意

那有沒有辦法既能實(shí)時顯示視頻也不用進(jìn)行圖像格式轉(zhuǎn)換還能有用戶操作界面?

筆者結(jié)合之前所學(xué)內(nèi)容最終決定用QT寫界面,V4L2編程來獲取實(shí)時的幀并將其顯示在設(shè)計好的界面上

開發(fā)環(huán)境

  1. 虛擬機(jī)Ubuntu 16.04
  2. 編輯器VsCode
  3. 交叉編譯工具 arm-linux-gnueabihf
  4. 已制作文件系統(tǒng),已使能UVC相關(guān)驅(qū)動
  5. 正點(diǎn)原子ZYNQ7010啟明星開發(fā)板
  6. USB攝像頭淘寶隨便買的一個
  7. QT Creator 5.9.6

必備知識

UVC驅(qū)動配置可以看我的這一篇: Linux 內(nèi)核4.14添加UVC配置

QT移植并顯示圖片可以看我的這一篇: Qt移植正點(diǎn)原子ZYNQ7010-Arm平臺顯示圖片demo,本博客的程序設(shè)計也是基于這一篇文章的

V4L2編程入門可以看我的這一篇: V4L2編程之USB攝像頭采集jpeg圖像

界面布局設(shè)計

V4L2+QT+USB攝像頭實(shí)時顯示視頻(Arm,Linux,window均適用)
可以先看一下運(yùn)行效果,主體部分一共就三個:一個QLabel控件用于顯示實(shí)時圖像,兩個QPushButton,一個用于控制視頻流的顯示,另一個用于解放資源并關(guān)閉窗口。

界面很簡單,本博客只是實(shí)現(xiàn)最基礎(chǔ)的功能,后續(xù)會在此基礎(chǔ)上加控件和其他功能。

程序設(shè)計思路

  1. 界面布局初始化
  2. 獲得用戶輸入,打開對應(yīng)攝像頭
  3. 攝像頭初始化,包括打印攝像頭支持的像素格式、分辨率、幀率
  4. 設(shè)置采集格式,包括像素格式、幀率設(shè)置
  5. 申請內(nèi)存空間并建立內(nèi)存映射,進(jìn)行出隊入隊操作
  6. 開啟視頻流
  7. 設(shè)置定時器,等待“開始”按鈕信號觸發(fā)定時器開啟
  8. 定時器定時獲取一幀圖像將其顯示在QLabel上
  9. 等待“結(jié)束”按鈕信號觸發(fā)釋放資源并關(guān)閉窗口

關(guān)鍵部分在于789三步,這里稍作解釋,不想看的可直接去看源碼——我的Github倉庫: Linux C編程實(shí)戰(zhàn)代碼
我已經(jīng)將源碼連同V4L2編程的API用戶手冊一并上傳了,歡迎大家學(xué)習(xí)交流

要在ARM平臺跑也是可以的,需要自行移植QT到ARM開發(fā)板,移植辦法詳見我往期博客Qt移植正點(diǎn)原子ZYNQ7010-Arm平臺顯示圖片demo

關(guān)鍵代碼分析

獲取用戶輸入賦值給v4l2_dev_init()初始化對應(yīng)的攝像頭
引入QCoreApplication獲取用戶輸入的第二個字段,例如執(zhí)行 ./Qt_V4l2 /dev/video1,device_parm[1] 的內(nèi)容即/dev/video1
值得注意的是需要進(jìn)行一個數(shù)據(jù)類型轉(zhuǎn)換才能作為open()函數(shù)的參數(shù)

    QStringList device_parm = QCoreApplication::arguments();
    QString str = device_parm[1];

    v4l2_dev_init(str.toStdString());
    
    ......
    
	int MainWindow::v4l2_dev_init(string device_name){
	    /* 打開攝像頭 */
	    v4l2_fd = open(device_name.c_str(),O_RDWR);
	    if(v4l2_fd < 0){
	        printf("open camera failed\n");
	        return -1;
	    }
	    printf("open camera success\n");
	    
	    ......
	    
	 }

兩個按鈕的信號連接代碼

    //點(diǎn)擊開始按鈕,打開定時器
    connect(pushButton[0],SIGNAL(clicked()),this,SLOT(timer_start()));

    //每隔固定的時間顯示一幀
    timer = new QTimer();
    connect(timer, SIGNAL(timeout()), this, SLOT(video_show()));

    /* 按鈕窗口關(guān)閉,先釋放設(shè)備,再關(guān)閉窗口 */
    connect(pushButton[1],SIGNAL(clicked()),this,SLOT(v4l2_device_release()));
    connect(pushButton[1],SIGNAL(clicked()),this,SLOT(close()));

定時器控制幀率,每個33ms觸發(fā)video_show()顯示一幀數(shù)據(jù),一秒鐘正好顯示30幀(筆者的攝像頭最大支持30fps,故如此設(shè)置)

/* 定時器控制幀 */
void MainWindow::timer_start(){
    // 1000/33約等于30,也就是每一秒顯示30幀
    timer->start(33);
}

初始化select()來進(jìn)行I/O端口復(fù)用

    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(v4l2_fd,&fds);

    //設(shè)置等待時間為2s
    struct timeval tv;
    tv.tv_sec = 2;
    tv.tv_usec = 0;
    select(v4l2_fd+1,&fds,NULL,NULL,&tv);

此段代碼摘自V4L2 API手冊最后的示例代碼中,相關(guān)pdf文檔已上傳到github

獲取一幀圖像的數(shù)據(jù),見于v4l2_get_one_frame(FrameBuffer *framebuf)
首先從出隊隊列中取一幀視頻數(shù)據(jù)的視頻緩沖區(qū),再將該幀數(shù)據(jù)拷貝到frame中

    if(0 > ioctl(v4l2_fd,VIDIOC_DQBUF,&one_buf)){
        printf("VIDIOC_DQBUF failed!\n");
        return -1;
    }
	// bytesused 表示buf中已經(jīng)使用的字節(jié)數(shù)
	    memcpy(framebuf->buf,(char *)buffer_infos[one_buf.index].start,one_buf.bytesused);
	    framebuf->length = one_buf.bytesused;

Qt 提供了四個用于處理圖像數(shù)據(jù)的類,而 QPixmap 正是為在屏幕上顯示圖像而設(shè)計和優(yōu)化
最后將獲取保存在frame中的數(shù)據(jù)用QPixmap轉(zhuǎn)換就可以顯示了

     FrameBuffer frame;
     QPixmap pix;

     //獲取一幀顯示
     v4l2_get_one_frame(&frame);
     pix.loadFromData(frame.buf, frame.length);
     pix.scaled(displayLabel->width(),displayLabel->height(),Qt::KeepAspectRatio);
     displayLabel->setPixmap(pix);

結(jié)束語

本博客的程序已上傳到github中,往期博客有關(guān)Linux C編程的代碼也一并上傳,需要的自行下載
地址:https://github.com/Huge-Hammer/Linux-C-Coding

后續(xù)會繼續(xù)更新,通過程序設(shè)計來實(shí)現(xiàn)拍照截圖、圖像處理、視頻流的存儲和推流等功能,慢慢完善了

我是愛學(xué)習(xí)的諸葛鐵錘,覺得有幫助的話記得點(diǎn)個贊再走吧,wakuwaku!

V4L2+QT+USB攝像頭實(shí)時顯示視頻(Arm,Linux,window均適用)文章來源地址http://www.zghlxwxcb.cn/news/detail-401330.html

到了這里,關(guān)于V4L2+QT+USB攝像頭實(shí)時顯示視頻(Arm,Linux,window均適用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • c 攝像頭利用v4l2直接生成avi視頻(不利用ffmpeg)

    自定義avi結(jié)構(gòu)頭文件?,F(xiàn)在不能實(shí)時顯示攝像頭畫面,準(zhǔn)備參照fim(終端中顯示圖片),直接對顯示framebuffer操作,顯示視頻。不用qt等。 生成的視頻根據(jù)機(jī)子的性能不同,詁計要手動調(diào)一下生成視頻的幀率。 播放: $ aplay ?musicdemo.wmv 錄音: $ arecord -c 2 -r 44100 -f S16_LE musicd

    2024年02月08日
    瀏覽(21)
  • 使用QT的QML實(shí)時顯示海康威視網(wǎng)絡(luò)攝像頭的視頻數(shù)據(jù)

    需求背景: 開發(fā)的監(jiān)控軟件中有個監(jiān)控頁面需要實(shí)時顯示網(wǎng)絡(luò)攝像頭的數(shù)據(jù),整個監(jiān)控軟件是基于QT的QML語言開發(fā)的。在QML中播放視頻使用MediaPlayer組件就可以,但網(wǎng)上看到的一些都是播放錄制好的視頻文件,對于實(shí)時播放攝像頭數(shù)據(jù)介紹的比較少。 開發(fā)環(huán)境: Debian11.3 Qt

    2024年02月09日
    瀏覽(97)
  • opencv-python調(diào)用攝像頭失敗 global /io/opencv/modules/videoio/src/cap_v4l.cpp (1000) tryIoctl VIDEOIO(V4L2

    Ubuntu 18.04 aarch64 Python 3.7.15 opencv-python 4.6.0 插入USB攝像頭后, /dev/video0 會正常出現(xiàn),使用 fswebcam 也能正常拍攝照片。但運(yùn)行 opencv-python 的視頻拍攝例程時出錯,例程如下。 如果例程正確運(yùn)行,屏幕窗口中將顯示灰度處理后的攝像頭實(shí)時視頻。 報錯信息如下 單步調(diào)試后,發(fā)現(xiàn)

    2023年04月24日
    瀏覽(22)
  • RK3568-USB攝像頭實(shí)時AI物品識別

    RK3568-USB攝像頭實(shí)時AI物品識別

    RK3568具有1TOPS算力的NPU,可以在板子上進(jìn)行AI計算。飛凌OK3568板子資料中自帶了一些AI識別的例子,但只是對一張圖片進(jìn)行識別,且需要單獨(dú)使用圖片查看工具查看識別結(jié)果。 為了更直觀的體驗(yàn)RK3568的AI算力,將AI識別例程與攝像頭功能結(jié)合起來,對攝像頭的每一幀圖像進(jìn)行物

    2024年02月10日
    瀏覽(28)
  • Ubuntu下python-opencv無法打開攝像頭,open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index

    Ubuntu下python-opencv無法打開攝像頭,open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index

    我們在ubuntu下使用opencv獲取攝像頭畫面是,報錯 open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index 然后觀察虛擬機(jī)桌面的右下角,如果出現(xiàn)攝像頭有小綠點(diǎn)表示連接成功 然后我們來測試一下,攝像頭的畫面 ####### 這是攝像頭傳輸回來的畫面

    2024年02月16日
    瀏覽(52)
  • Python OpenCV讀取并顯示USB UVC攝像頭

    1. 安裝Python, 略。 2.?安裝 OpenCV:???????? 3. 預(yù)覽攝像頭畫面腳本:

    2024年02月13日
    瀏覽(29)
  • RK3588安裝Qt+opencv+采集USB攝像頭畫面

    RK3588安裝Qt+opencv+采集USB攝像頭畫面

    Qt:5.12.8 opencv:3.4.14 qt安裝 ---------------------------------------------------------------------------------- 因?yàn)槭褂霉倬W(wǎng)下載的版本始終安裝失敗,所以我可以直接使用命令行進(jìn)行下載安裝: 1:首先先將ubuntu的軟件更新,并更新鏡像源 sudo apt-get update sudo apt-get upgrade 2:使用如下步驟安裝Qt

    2023年04月10日
    瀏覽(29)
  • linux v4l2架構(gòu)分析之異步注冊v4l2_async_subdev_notifier_register、v4l2_async_register_subdev、v4l2_async_notifie

    ? ? ? ? 在camera驅(qū)動注冊中,v4l2_async_subdev_notifier_register、v4l2_async_register_subdev、v4l2_async_notifier_register這幾個函數(shù)都會被使用到,三者在異步注冊的實(shí)現(xiàn)中是緊密關(guān)聯(lián)的,所以本文將三者放在一起進(jìn)行分析。本文主要介紹異步注冊的功能的整體實(shí)現(xiàn)框架,為了更好把握整體思

    2024年02月14日
    瀏覽(36)
  • python調(diào)用海康網(wǎng)絡(luò)攝像頭,實(shí)時顯示監(jiān)控內(nèi)容

    python調(diào)用??稻W(wǎng)絡(luò)攝像頭,實(shí)時顯示監(jiān)控內(nèi)容

    用網(wǎng)線將??低晹z像頭與電腦連接在一起;(或者用交換機(jī),在一個交換機(jī)下面) ??禂z像頭的默認(rèn)ip是192.168.1.64 效果:和通過??禂z像頭網(wǎng)址效果一樣 rtsp://用戶名:密碼@ip地址/Streaming/Channels/2

    2024年02月16日
    瀏覽(31)
  • 使用 MFC 和 OpenCV 實(shí)現(xiàn)實(shí)時攝像頭視頻顯示

    1、引言 MFC 是一個在 Windows 平臺上編寫 C++ 應(yīng)用程序的庫,提供了豐富的用戶界面功能。OpenCV(Open Source Computer Vision Library)是一個開源的計算機(jī)視覺庫,包含了豐富的圖像處理和計算機(jī)視覺功能。本文將向大家展示如何將這兩個庫結(jié)合起來,實(shí)現(xiàn)一個實(shí)時顯示攝像頭畫面的簡

    2024年02月13日
    瀏覽(113)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包