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