999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Linux系統的USB攝像頭視頻播放實現

2008-04-12 00:00:00裴海龍
現代電子技術 2008年24期

摘 要:隨著USB攝像頭的普及以及Linux系統桌面應用的推廣,基于Linux系統的視頻播放程序設計有著現實應用的意義。采用應用編程接口Video4Linux2所提供的數據結構、應用函數等,實現在Linux環境下USB攝像頭圖像數據的采集功能,并運用GTK庫顯示和播放其視頻圖像。運用Linux標準庫函數實現了數字圖像的采集,對基于Linux內核的后續圖像應用開發具有實用意義。該程序采用Linux系統下新的視頻編程接口和標準庫函數,以模塊化結構實現所需功能,具有良好移植性,基于此平臺可方便加入圖像處理等其他應用模塊。

關鍵詞:Video4Linux2;圖像采集;攝像頭;GTK;顯示播放

中圖分類號:TP31681文獻標識碼:B

文章編號:1004-373X(2008)24-093-03

Programming for the Display of USB Camera on the Linux System

CHEN Liang,PEI Hailong,WU Yue

(College of Automation Science and Engineering,South China University of Technology,Guangzhou,510640,China)

Abstract:With widely and rapidly using of USB camera and the popularization of Linux system desktop,it′s meaning to program for the display video on the Linux system.This paper makes use of the data configuration and the application function which belongs to Video4Linux2 application programming interface,capturing the video picture of the USB camera on the Linux system,and displaying it with GTK are implemented.Programming for the capture of image data on the standard library of Linux,it is usefully significative to exploit the application of image on the Linux kernel.This program uses new API of video and standard library on the Linux,the function is achieved by modularize structure so that it can be transplanted easily and added to other application module such as image processing.

Keywords:Video4Linux2;image acquisition;camera;GTK;display

所述程序基于Linux系統平臺,結合Video4Linux2應用編程接口進行USB攝像頭視頻圖像采集,并運用GTK函數庫將視頻圖像實時顯示播放,在此程序基礎上可以方便地進行圖像識別、視覺導航等應用的二次開發。Video4Linux2是Video For Linux Two的簡稱,其為Linux系統下視頻音頻的采集及輸出等應用編程提供內核接口。Video4Linux2是Video For Linux API的第二版本,相較于Video4Linux其改變甚多,在數據結構定義和函數使用上都有很大的變化,在性能上得到很大提高的同時,也使得其并沒有向下兼容Video4Linux,給應用程序的升級維護制造了很大的麻煩。目前在2.5以上的內核版本中,系統均已默認支持Video4Linux2 API。

GTK全稱為GIMP Tool Kit,即GIMP工具包,是用于實現圖形用戶界面的函數庫,已經發展為Linux下開發圖形界面應用程序的主流開發工具之一。在本程序設計中與采集圖像數據后,運用GTK函數庫,最終實現在桌面上攝像頭圖像的連續顯示播放。

1 攝像頭驅動程序加載

在Linux下,所有的外設均被看成是一種特殊文件進行處理,稱之為設備文件。系統調用及各種函數庫直接或間接地提供了內核和應用程序之間的接口,而設備驅動程序則是內核和外設之間的接口,它完成設備的初始化和釋放、對設備文件的各種操作和中斷處理等功能。由于屏蔽了外設硬件的細節,使得應用程序可以像普通文件一樣對外設進行操作而無需關注其具體的細節。在本程序設計中將對設備文件/dev/video0進行視頻圖像采集,其中0表示第一個視頻設備的編號,以此類推。

這里使用羅技快看系列中Communicate Deluxe型號的USB攝像頭進行視頻圖像采集,采用Linuxuvc驅動程序,這是一個為USB視頻設備提供驅動的開源項目,支持Video4Linux2應用編程接口,具體步驟如下:

(1) 下載和安裝Linuxuvc驅動程序,并將生成的模塊文件Linuxuvc.ko復制至/lib/modules/′uname-r′/kernel/drivers/media/video目錄下;

(2) 在終端使用命令“modprobe linuxuvc”加載驅動模塊,或者在其安裝目錄下使用命令“insmod linuxuvc.ko”加載也可。

2 GTK主程序設計

GTK應用程序采用事件驅動機制,在完成用戶界面創建后進入Gtk_main()主循環,由此GTK接管了控制權,然后在主循環中循環地監聽事件和信號的發生。當捕獲事件或信號后,則將控制權傳遞至所注冊的信號事件處理程序進行處理,然后根據此程序選擇返回或者退出GTK應用程序。同時,視頻圖像的截取和顯示播放也是一個循環。在本程序中采取將視頻圖像讀取及顯示模塊(Cam_show())注冊為GTK空閑函數,由此使得每次通過GTK主循環后都將調用此模塊,讀取和顯示一幀圖像。主程序的流程設計如圖1所示。

3 視頻設備初始化模塊設計

在Linux系統下視頻設備的圖像數據采集是基于Video4Linux2應用編程接口的,通過使用接口提供的有個數據結構定義和函數庫,對攝像頭進行初始化。下面對主要步驟以及所用到的關鍵函數進行介紹。

3.1 打開視頻設備文件

int fd;

fd =open(\"/dev/video0\",O_RDWR);

利用open函數打開視頻設備后,可以獲取相應的文件描述符;若打開失敗,則要求返回相應的錯誤信息。在實際的程序設計中,必須加入類似的出錯處理,以方便程序調試。

3.2 獲取視頻設備相關屬性

struct v4l2_capability cap;

ioctl (fd,VIDIOC_QUERYCAP, cap)

在Linux程序設計中ioctl調用有點像是大雜燴,它提供了一個用于控制設備及其描述符行為和配置底層服務的接口,對設備的I/O通道進行管理。終端、文件描述符、套接字甚至磁帶機都可以使用為它們定義的ioctl,在Video4Linux2中也是通過ioctl函數對設備進行編程的。其原型為:int ioctl(int fildes,int cmd,…);ioctl對描述符fildes指定的對象執行cmd參數中給出的操作,根據具體函數還可能有一個可選的第三參數。如上所示,利用VIDIOC_QUERYCAP來取得設備文件的屬性參數并存儲于cap結構中,然后就可以讀取設備的關鍵屬性。在此應用中,攝像頭設備顯示支持視頻截取和流操作,但不支持讀寫操作。

3.3 設置圖像采集格式

struct v4l2_format fmt;

fmt.fmt.pix.width=640;

fmt.fmt.pix.height=480;

fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;

ioctl(fd,VIDIOC_S_FMT, fmt)

將fmt結構填入適當的值,然后通過傳遞VIDIOC_S_FMT命令參數對設備的圖像采集格式、大小等進行初始化。在程序測試中顯示此設備不能初始化為GTK能直接顯示的RGB格式,因此在其后的圖像處理中首先將YUYV格式轉為RGB格式,這些內容將在文章的第五節詳述。

3.4 內存映射初始化

在Video4Linux2下截取圖像有2種方法:mmap內存映射方式和直接讀取設備方式。在屬性檢驗中可知此設備不支持讀寫操作,而且前者采用共享內存通信,不需要任何數據的拷貝,效率高,因此選用mmap內存映射方式,這也是程序設計中的一個難點,其用到的主要函數如下:

Ioctl (fd,VIDIOC_REQBUFS, reqbuf);

ioctl (fd,VIDIOC_QUERYBUF,buffer);

void *mmap (NULL,size_t len,int prot,int flags,fd,off_t off);

ioctl (fd,VIDIOC_QBUF,buf);

ioctl (fd,VIDIOC_STREAMON,type);

與最初的Video4Linux應用編程接口相比,新的接口最大的改變在于可自定義設備驅動緩存數量,在實際應用中大大提供了程序的性能。其主要步驟如下:首先,帶VIDIOC_REQBUFS命令參數的ioctl函數分配自定義的緩存數量,這在初始化中是必須的一步;然后,可以引入一個循環中,分別對各個緩存進行映射,其偏移量和緩存大小可在VIDIOC_QUERYBUF命令參數的ioctl函數中定義;最后利用用mmap()函數將在設備緩存和應用程序所分配內存間建立映射,并返回應用程序內存的首地址,至此內存映射初始化完畢。

在內存映射完畢后,此時還不能開始進行圖像采集,下面兩個步驟提示系統將使用這些內存進行圖像采集。首先,VIDIOC_QBUF命令參數的ioctl函數將此空緩存加入等待輸入緩存隊列;在緩存加入等待輸入隊列后,調用1次VIDIOC_STREAMON命令參數的ioctl函數,由此可以正式使用這些緩存進行圖像數據了。

4 YUYV格式與RGB格式的轉換

顯示器顯示色彩的原理與彩色電視機一樣,都是采用R(Red),G(Green),B(Blue)相加混色的原理:通過發射出3種不同強度的電子束,使屏幕內側覆蓋的紅、綠、藍磷光材料發光而產生色彩。這種色彩的表示方法稱為RGB色彩空間表示,這也是多媒體計算機技術中用得最多的一種色彩空間表示方法。在本程序中使用的RGB24使用24位來表示1個像素,RGB分量都用8位表示,取值范圍為0~255。

YUV是被歐洲電視系統所采用的一種顏色編碼方法(屬于PAL),其中“Y”表示明亮度,也就是灰階值;而“U”和“V” 表示的則是色度,作用是描述影像色彩及飽和度,用于指定像素的顏色。與RGB視頻信號傳輸相比,它最大的優點在于只需占用極少的頻寬(RGB要求3個獨立的視頻信號同時傳輸)。YUYV是YUV格式的其中一種,YUV比例為4∶2∶2,它為每個像素保留Y分量,而UV分量在水平方向上每2個像素采樣一次。一個宏像素為4個字節,實際表示2個像素。(4∶2∶2的意思為1個宏像素中有4個Y分量、2個U分量和2個V分量。)圖像數據中YUV分量排列順序如下:

Y0 U0 Y1 V0 Y2 U2 Y3 V2…

前面提到攝像頭只能初始化為YUYV圖像格式,而在GTK顯示區域中可以顯示RGB格式的圖像數據。因此在顯示之前必須進行圖像數據處理,將YUYV格式轉換為RGB24,轉換公式為:

R=1.164*(Y-16)+1.159*(V-128);

G=1.164*(Y-16)-0.38*(U-128)-

0.813*(V-128);

B=1.164*(Y-16)+2.018*(U-128)

5 圖像采集模塊設計

這個模塊的進程主要有3個步驟:首先,VIDIOC_DQBUF命令參數的ioctl函數將已填滿圖像數據的緩存清空出列;其次,此時與之映射的應用程序內存已經儲存圖像數據,可以對其進行圖像數據處理操作,將YUYV格式轉為RGB24格式,使用GTK函數將圖像數據寫入圖像顯示區域,顯示播放出這一幀的圖像;最后,將出列的空緩存重新加入等待輸入隊列,由此構成一個采集循環。

正如前面所提到的那樣,GTK主循環在接管控制權后,將循環監聽和響應事件或信號并選擇返回或退出,而圖像采集模塊也需要循環地采集圖像幀,一般來說這種情況下可以采用多線程編程的方法使主程序具有多個執行路線,同步運行兩個循環。GTK庫提供了一個更為簡單的方法:使用空閑函數。每次通過GTK主循環后都將調用1次空閑函數(如果有),由此實現應用程序和GTK主循環的處理進程之間的共享,可以方便地在應用程序中進行數據更新、傳送等,同時同步地處理GTK系統事件,如窗口發布、界面的同步刷新等。

在這個程序中正是應用這個方法,將采集模塊注冊為GTK空閑函數,每次通過GTK主循環后都將調用模塊。在GTK主函數和采集模塊中必須調用GTK提供的線程控制函數,這是由于空閑函數是在GTK主循環外即在GTK控制鎖之外執行的。在某一時間只有1個線程能夠使用GTK函數,因此必須保證在任何時候只有GTK主程序和采集模塊之其一在使用GTK函數。在每個循環中,采集模塊讀取圖像數據并寫入圖像顯示區域,GTK主程序進行窗口的更新,最終實現實時連續地顯示播放視頻圖像。

6 結 語

該程序在Linux系統環境下實現了使用USB攝像頭采集視頻圖像并連續顯示播放的功能,主要涉及使用了Video4Linux2應用編程接口和GTK函數庫,以及一些Linux程序設計中基本的系統調用或標準庫函數,在類Linux系統中具有良好的移植性。此外,本程序結構比較簡單,組織清晰,可以方便地加入各種圖像處理模塊,進一步實現圖像處理、識別等所需功能。

參考文獻

[1]馮琪.小型無人直升機基于視覺的導航系統分析與設計[D].廣州:華南理工大學,2005.

[2]羅沛.空中機器人視覺導航系統的研究與設計[D].廣州:華南理工大學,2007.

[3]Syd Logan,戰曉蘇,王寧.Gtk+程序設計(C語言版)[M].北京:清華大學出版社,2002.

[4]阮秋琦,阮宇智,Gonzalez R C,等.數字圖像處理[M].北京:電子工業出版社,2003.

[5]魏永明.Rubini A.Linux設備驅動程序[M].北京:中國電力出版社,2002.

[6]裘宗燕.Stroustrup B.C++程序設計語言[M].北京:機械工業出版社,2005.

[7]龍晉元.Richard W.Unix環境高級編程[M].2版.北京:人民郵電出版社,2006.

[8]Neil Matthew,Richard Stones,陳健,等.Linux程序設計[M].3版.北京:人民郵電出版社,2007.

[9]Anon.V4L2 API Specification [EB/OL].http://v4l2spec.bytesex.org/spec/book1.htm.2007.

[10]王永清,何波,王乾,等.Linux下基于ARM920T的USB攝像頭圖像采集[J].微計算機信息,2007(2):176-177.

[11]廖敬萍,馬力.基于Linux的實時解決方案分析[J].現代電子技術,2006,29(19):107-109.

[12]萊特,Wright Peter P,鐘鳴,等.GTK+/GNOME程序設計[M].北京:機械工業出版社,2002.

作者簡介

陳 亮 男,1983年出生,廣東興寧人,碩士研究生。主要研究方向為圖像處理、嵌入式系統。

裴海龍 男,1965年出生,博士,副院長,教授,博士生導師。主要從事嵌入式系統、智能機器人系統,自適應自組織控制等方面的研究和教學工作。

伍 越 男,1983年出生,碩士研究生。主要研究方向為Linux嵌入式系統及實時仿真系統的構建。

主站蜘蛛池模板: 美女一级毛片无遮挡内谢| 久久精品国产亚洲麻豆| 亚洲av无码人妻| 女人毛片a级大学毛片免费| 真实国产乱子伦视频| 亚洲婷婷丁香| 国产一区二区精品福利| 久久国产精品麻豆系列| 国产成人做受免费视频| 国产欧美网站| 日韩精品无码不卡无码| 91视频日本| 亚洲精品视频在线观看视频| 1024国产在线| 性色生活片在线观看| 国产精品精品视频| 国产欧美日韩综合一区在线播放| 欧美中文字幕在线播放| 91精品国产综合久久不国产大片| 国产精品成人久久| 国产欧美视频在线观看| 国产99视频精品免费观看9e| 思思热在线视频精品| 日本成人一区| 免费观看成人久久网免费观看| 亚洲欧美国产视频| 91外围女在线观看| 国产中文一区a级毛片视频| 亚洲日韩高清无码| 日日摸夜夜爽无码| 久久 午夜福利 张柏芝| 丁香五月亚洲综合在线| 91精品国产自产在线观看| 国产视频一区二区在线观看| 麻豆国产精品| 日韩不卡高清视频| 亚洲成在线观看| av一区二区三区高清久久| 国产成人一级| 欧美精品伊人久久| 亚洲va在线观看| 国产 日韩 欧美 第二页| 国产精品熟女亚洲AV麻豆| 99re热精品视频中文字幕不卡| 欧美区一区| 国产在线精品99一区不卡| 欧美区一区| 中文字幕色站| 免费精品一区二区h| 国产在线视频自拍| 看你懂的巨臀中文字幕一区二区| 国产在线视频自拍| 亚洲精品色AV无码看| 欧美亚洲另类在线观看| 国产精品无码AV中文| 精品人妻无码中字系列| 成人韩免费网站| 亚洲精品无码成人片在线观看 | www中文字幕在线观看| 香蕉色综合| 国产精品亚洲精品爽爽| 一区二区在线视频免费观看| 理论片一区| 91青青草视频| 精品国产中文一级毛片在线看| 欧美综合区自拍亚洲综合天堂| 日韩123欧美字幕| 亚洲综合第一区| 亚洲天堂视频在线播放| 久久久久无码精品| 露脸国产精品自产在线播| 污污网站在线观看| 久久久久无码精品国产免费| 亚洲日韩精品伊甸| 国产高潮视频在线观看| 无码一区二区三区视频在线播放| 99在线观看国产| 无码综合天天久久综合网| 无码在线激情片| 亚洲三级电影在线播放| 91伊人国产| 亚洲欧美精品一中文字幕|