1. 程式人生 > >Linux環境下使用V4L2+opencv以MJPEG格式讀取USB攝像頭並實時顯示

Linux環境下使用V4L2+opencv以MJPEG格式讀取USB攝像頭並實時顯示

轉眼間,V4L2已經搞了很長時間,從最開始的一竅不通,到後來的漸漸熟悉,從最開始照貓畫虎的使用YUYV格式之間轉換,到後來使用MJPEG格式讀取,中間頗有周折。趁任務完成間隙,來簡單總結下V4L2的使用。(文章只主要寫了過程,完整程式已經附在最後)

有讀者要問,opencv已經有相關的讀取攝像頭的函式,為什麼要使用V4L2這麼麻煩呢。其實主要是因為後面要將程式移植到板子上,而在板子上不能直接使用opencv中讀取攝像頭的函式的,所以需要藉助V4L2來實現讀取視訊的功能。還有,既然YUYV格式這麼簡單(見文章末尾附的大神的部落格),為什麼要用MJPEG格式呢?這一點主要是考慮到YUYV資料量較大,影響攝像頭讀取速度,也會影響到後面都視訊資料傳輸的擴充套件。

V4L2主要應用於linux讀取USB攝像頭,有關它的介紹網上有很多資料,這裡不再贅述。結合主題,本文主要講述如何使用MJPEG格式讀取並將其轉換為OpenCV中的IplImage格式,以方便進行影象處理,最後以視訊的形式進行實時顯示。截至到今天晚上,已經使得程式能夠實時以MJPEG格式讀取並顯示,影象解析度為1920*1080,速度100ms每幀。由於專案需要,所以儘可能使用較大解析度,導致速度有點慢,如果使用普通的640*480,速度比較會比較快。

有點囉嗦,下面進入主題:使用MJPEG格式讀取視訊,並實時顯示。整個過程主要分為以下幾個步驟:

1.      開啟視訊裝置檔案,並進行引數初始化,設定採集解析度、格式等;

該步驟中主要使用函式:

Open(“/dev/video0”,O_RDWR);//開啟USB攝像頭

ioctl(fd,VIDIOC_QUERYCAP,&cap);//查詢裝置的資訊

ioctl(fd,VIDIOC_S_STD,&fmt);//設定視訊的格式

2.      申請幀緩衝區,並將其對映到使用者空間;

ioctl(fd,VIDIOC_REQBUFS,&req);//申請緩衝幀

malloc(req.count*sizeof(*buffer));

ioctl(fd,VIDIOC_QUERYBUF,&buf);//將申請到的幀緩衝對映到使用者空間

3.      將申請到的幀緩衝區在視訊採集輸入佇列排隊,並啟動視訊採集;

ioctl(fd,VIDIOC_QBUF,&buf);//將申請到的幀緩衝全部加入佇列

ioctl(fd,VIDIOC_STREAMON,&byte);//開始採集

4.      應用程式從視訊採集輸入佇列取出幀緩衝區,將其轉換為OpenCV中的通用資料格式,然後顯示,之後重新放入視訊採集佇列,迴圈該過程;

ioctl(fd,VIDIOC_DQBUF,&buf);//取緩衝幀

CvMatcvmat=cvMat(IMAGEHEIGHT,IMAGEWIDTH,CV_8UC3,(void*)buffer);//將幀內容賦值給CvMat格式的資料

IplImage img =cvDecodeImage(&cvmat,1);//解碼,這一步將資料轉換為IplImage格式

cvShowImage(“one”,img);//顯示影象

cvReleaseImage(&img);//釋放影象空間

ioctl(fd,VIDIOC_QBUF,&buf);//將緩衝重新加入隊尾

迴圈上面的步驟,就可以形成視訊啦

5.      停止視訊採集,關閉裝置檔案。

ioctl(fd,VIDIOC_STREAMOFF,&byte);

close(fd);

由於時間關係,上面只是簡單介紹了一下整個過程,相關函式的使用和函式中的結構體引數網上都有很多資料可供參考,當然也可以看下官方給的API手冊,講的很詳細,但是有點長,且是英文的。下面列出我學習時找到的一些資料,

最後附上我自己的程式,目前程式能夠實現基本的功能,但是本人還想進一步優化以提高效率,有其他好的想法的朋友可以與我聯絡。Mail:[email protected]

一個大神的部落格,最開始我就是按照這個學習的

V4L2的官方手冊:

我自己的程式:

網址:<http://download.csdn.net/download/tsuibeyond/10256918>

程式是在linux環境下使用QT編譯的,需要自己安裝OPENCV,並在.pro檔案中配置,我的.pro檔案中已經將相關路徑寫入,讀者使用時可以按照自己安裝OPENCV的路徑修改。

最後,加上效果圖展示,由於解析度較大,螢幕不能顯示完整視窗:

相關推薦

Linux環境使用V4L2+opencvMJPEG格式讀取USB攝像頭實時顯示

轉眼間,V4L2已經搞了很長時間,從最開始的一竅不通,到後來的漸漸熟悉,從最開始照貓畫虎的使用YUYV格式之間轉換,到後來使用MJPEG格式讀取,中間頗有周折。趁任務完成間隙,來簡單總結下V4L2的使用。(文章只主要寫了過程,完整程式已經附在最後) 有讀者要問,open

OpenCV入門學習之讀取usb攝像頭影象,實時顯示

首先,新建一個.cpp的源程式檔案,例如,gedit test.cpp 在該檔案中新增以下程式: #include <opencv2/core/core.hpp> #include

linux環境編譯運行OpenCV程序的兩種方法

https 鏈接庫 pen vco ons 程序 TP uil htm 一、命令行Command Line 1 g++ opencv_test.cpp -o opencv_test `pkg-config --cflags --libs opencv` 2 ./op

linux環境安裝php_imagick擴充套件,linux php ImageMagick缺少jpg,png,tiff格式

linux環境安裝外掛缺少tiff格式,查找了很多資料,大多數都描述的一知半解,現總結如下: 一、安裝ImageMagick依賴庫 下載、解壓、進入解壓目錄、編譯安裝。 tar zvxf tiff-4.0.9.tar.gz cd /root/tiff-4.0.9

linux環境編譯執行OpenCV程式的兩種方法

  原來以為在Ubuntu下安裝好了OpenCV之後,自己寫個簡單的程式應該很容易吧,但是呢,就是為了編譯一個簡單的顯示圖片的程式我都快被弄崩潰了。   在谷歌和上StackOverFlow檢視相關問題解答之後,我下面就介紹Command Line和CMake兩種方式。

OpenCV MJPEG格式 讀取攝像頭資料

                    OpenCV   以MJPEG的格式  讀取攝像頭資料   可以使用opencv讀取。 原始碼: #include

python 庫安裝,安裝 numpy matplotlib opencv wxpython PIL(linux環境

    很喜歡Ubuntu12.04 下的簡潔的而高貴的介面,vim在裡面也是非常的賞心悅目!所以決定在linux下面來學習python。     這個版本的linux下面自帶了python2.7。輸入命令:python 就可以進入到python指令碼的編寫了。同時也可

Linux學習】Linux環境利用wget下載https連結內容時報錯:無法本地校驗頒發者的許可權。 要不安全的方式連線至 ,使用“--no-check-certificate”

一、問題描述 今天在CenterOS系統上使用wget命令下載一個https連結的內容時報錯,如下所示: [[email protected] /]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-

Linux環境OpenCV的安裝與配置

Linux下OpenCV的安裝 1.cmake以及相關依賴庫的安裝 因為OpenCV2.2版本之後,需要用cmake來生成Makefile檔案,因此在安裝OpenCV之前,要安裝cmake以及cmake依賴庫。 終端輸入:apt-get install cmake apt-get i

Linux環境OpenCV的安裝

1、下載opencv安裝包至本地,解壓 2、安裝cmake ① sudo apt-get install cmake ② cmake -version            檢視版本,檢驗是否已經安裝成功 3、安裝依賴庫(需先執行此步,再安裝opencv) s

Linux環境OpenCv開發環境配置

原始碼下載:          1. OpenCV原始碼下載:http://opencv.org/downloads.html   \   opencv-2.4.10.zip            2. Cmake工具下載: http://www.cmake.org/dow

將在Windows環境編寫的sh檔案格式轉化為Linux的sh檔案

先演示一個翻車的現場: 這個是在Linux下編寫的一個shell(B)指令碼: 執行看看: 沒問題,現在在Windows下編寫一個: 儲存後上傳至虛擬機器,執行發現居然報錯了: 檢視一下test.sh內容: 根本沒什麼問題啊,這時候再用cat -A檢視

Linux環境的 pyenv的安裝

pyenvCentOS上安裝pyenv:在安裝pyenv前,需要先安裝如下的依賴包:在 CentOS/RHEL/Fedora 下:yum install readline readline-devel readline-static yum install openssl openssl-devel open

linux環境部署zabbix3.2、模板、郵件告警詳細過程

-1 ice erer without zlib zip ever native item 服務端部署: 系統環境及軟件版本: Linux:release 6.3 zabbix:zabbix-3.2.5.tar.gz nginx:nginx-1.12.0.tar.gz ph

2.Linux環境配置Solr4.10.3

margin 內容 src source -type alt 技術 tgz 安裝包 1.準備階段 操作系統:CentOS 6.8 安裝包:/home/test solr-4.10.3.tgz.tar IK Analyzer 2012FF_hf1.zip jdk-8u12

由一個簡單需求到Linux環境的syslog、unix domain socket

message python domain 服務器 import 需求:回到頂部  工作中有一個在Linux(debian8)環境下運行的服務器程序,用python語言實現,代碼中有不同優先級的日誌需要記錄,開發的時候都是使用python的logging模塊輸出到文件,示例代碼如下:  

(1)Jenkins Linux環境的簡單搭建

linux java jenkins安裝部署 jdk apache-maven (1)Jenkins Linux環境下的簡單搭建 Jenkins是一個開源軟件項目,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。----百度百科 這是一款基於Java開發的工具。種種

linux 環境備份oracle 數據庫

備份 命令 目錄 lin 安裝目錄 su - linux 輸出 所有者 登陸linux後,進入oracle的安裝目錄下,找到bin那個目錄,進入bin目錄ls -l 看這些命令的所有者: su - oracle這時會進入這個用戶的主目錄/home/oracle,此時,可以用

將windows上面的項目拷貝到Linux環境報錯不能夠找到對應的表com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'puyang.ServiceType' doesn't exist

exce 服務 inux 區分 大小 blog alt logs 就會 將一模一樣的項目從win遷移到到linux上報錯: 一開始還是以為是linux不能識別hql語句,查找資料發現是因為Liunx服務器上mysql是區分大小寫的,而本地是不區分的如:代碼是這樣寫的@En

linux環境關於顯示日期及修改密碼的小練習

一只小菜鳥的成長1.顯示1984-11-18是1984年的第幾天 2.顯示當前的日期 ##上面是兩種不同的表現形式## 3.在超級用戶下修改student用戶的密碼,並且student用戶在第一次登錄後強制修改密碼 ## passwd -e ## 強制修改密碼##註意:當使用root用戶修改其他用戶密