嵌入式Linux視頻采集系統的設計與實現
在本系統中,程序主要用到的一些系統調用函數如下:open(“/dev/video0”,O_RDWR):設備的打開。
close(fd):設備的關閉。
mmap(voidaddr,size_tlen,intprot,intflags,intfd,off_toffset):設備緩沖區到內存空間的映射。
munmap(voidaddr,size_tlen):采集工作結束后取消mmap和mbuf的綁定。
ioctl(intfd,intcmd,。。。):控制I/O通道。
4。2。2視頻采集程序的實現1)打開攝像頭首先對上面提到的類進行初始化,接下來利用系統調用函數_fd=open(“devfile”,O_RDWR),該函數的功能是打開參數devfile指定的設備,對于攝像頭用設備文件名“/dev/video0”表示,_fd是設備打開后返回的文件描述符,以后可以直接使用它來對設備文件進行操作。
2)獲取攝像頭參數通過ioctl(_fd,VIDIOCGCAP,capability)函數來讀取structvideo_capability結構中有關攝像頭的信息。ioctl(int_fd,intcmd,。。。)主要是用來控制I/O通道,函數成功返回后使用printf函數得到各成員分量信息,接著調用ioctl(_fd,VIDIOCGWIN,window)和ioctl(_fd,VIDIOCGPICT,picture)函數讀取structvideo_window信息和攝像頭緩沖區中的video_picture圖像信息。
3)設置攝像頭緩沖區中圖像參數在采集攝像頭視頻數據前,可根據需求修改圖像參數如分辨率等,具體方法為先給分量賦新值,再調用函數ioctl(_fd,VIDIOCSPICT,picture)。
4)視頻數據的讀取與read()方式相比,mmap()方式通過把設備文件映射到內存,繞過了內核緩沖區,加速了I/O訪問。完成內存映射之后,就可以用mmap()方式實現對內存映射區域視頻數據的單幀采集。此方式下真正做視頻截取的為VIDIOCMCAPTURE,調用函數ioctl(_fd,VIDIOCMCAPTURE,mmap),激活設備并真正開始一幀圖像的截取,是非阻塞的,接著調用ioctl(_fd,VIDIOCSYNC,frame)函數等待一幀圖像截取結束,成功返回表示一幀截取已完成,接著可以做下一次的VIDIOCMCAPTURE操作。
經過上述的幾個過程,系統完成了對USB攝像頭的驅動、對視頻數據的采集工作,捕獲到的視頻幀被映射到內存區域,如果要對視頻數據進行壓縮等處理工作則可通過訪問內存映射區域進行。
5結語作為網絡視頻監控系統的一部分,本方案基于目前市場上主流的ARM處理器與嵌入式Linux操作系統,實現了視頻數據的實時采集,整個系統數字化、網絡化程度高,與傳統的采集系統相比有較大優勢。經辦公室局域網測試,該系統實時性好、穩定可靠、圖像質量也比較優越,可廣泛應用在交通、銀行、工業監控及視頻會議等眾多領域。目前該項目產生的經濟效益約為20萬元。
本文作者創新點:設計了一個基于嵌入式Linux的視頻采集系統,詳細介紹了Video4Linux下USB攝像頭驅動和視頻采集程序的實現過程。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論