基于A(yíng)RM9的轉轍機缺口監測圖像采集模塊設計
下面簡(jiǎn)要介紹其實(shí)現:
(1)打開(kāi)視頻設備,這里用int v41_open(char*,v41_device*)實(shí)現。
(2)獲得設備信息的任務(wù),這里用extern int v41_get_capability(v41_device*)實(shí)現。函數有vd->capability和vd->picture兩個(gè)結構體。capability主要包括設備名稱(chēng)、支持的最大最小分辨率、信號源信息等。picture結構包括了亮度,對比度,色深。及兩個(gè)函數中最主要的語(yǔ)句ioctl。對于ioctl的行為,它是由驅動(dòng)程序提供和定義的,在這里是由v41所定義,其中宏VIDIOCGCAP和VIDIOCGPICT的分別表示獲得視頻設備的capability和picture。
運用int v41_get_mbuf(v41_device*vd)函數。通過(guò)這個(gè)結函數可以獲得攝像頭可映射的設備存儲圖像的內存大小、攝像頭可同時(shí)存儲的幀數、每一幀圖像的偏移量。
(3)按需要更改設備的相應設置,通過(guò)int v41_set_picture函數實(shí)現。其核心是v41為提供的ioctl相關(guān)調用,通過(guò)這個(gè)函數可以修改如亮度,對比度等相關(guān)的值。
(4)獲得采集到的圖像數據,通過(guò)extern int v41_grab_picture實(shí)現。先使用ioctl(fd,VIDIOCGMBUF,grab_vm)函數獲得攝像頭存儲緩沖區的幀信息,之后修改voideo_mmap中的設置,例如重新設置圖像幀的垂直及水平分辨率、彩色顯示格式。其中vd->map所指向的數據就是圖像數據。
采集其中的第一幀,使用ioctl(fd,VIDIOCMCAPTURE,grab_buf)函數,若調用成功,則激活設備真正開(kāi)始一幀圖像的截取,是非阻塞的。接著(zhù)使用ioctl(fd,VIDIOCSYNC,frame)函數判斷該幀圖像是否截取完畢,成功返回表示截取完畢,之后就可把圖像數據寫(xiě)入到Frame Buffer。
然后利用grab_fd.frames值確定采集完畢攝像頭幀緩沖區幀數據進(jìn)行循環(huán)的次數。在循環(huán)語(yǔ)句中,也是使用VIDIOCMCCAPTURE? ioctl和VIDIOCSYNC?ioctl函數完成每幀截取,但要給采集到的每幀圖像賦地址,利用語(yǔ)句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要繼續采集可再加一個(gè)外循環(huán),在外循環(huán)語(yǔ)句只要給原來(lái)的內循環(huán)再賦frame=0即可。通過(guò)顯示屏把采集到的視頻圖像顯示出來(lái)。
(5)關(guān)閉設備,int v41_close(v41_device*),主要是關(guān)閉設備,取消映射。
5 圖像采集效果
將攝像頭插入到USB主機下行口,這時(shí)在終端上將打印以下信息:
ov511.c:USB OV511+camera found
ov511.c:Camera type(108)not recognized
ov511.c:Please notify mmcclell@bigfoot.com of the name,
ov511.c:manufacturer,model.a(chǎn)nd this number of your camera.
ov511.C:Also include the output of the detection process.
ov511.c:Sensor iS an OV7620
ov511.c:Device registered on minor 0
進(jìn)入到本實(shí)驗程序所在文件夾,運行本實(shí)驗程序,觀(guān)察液晶屏的圖像效果:
#/videodemo本文引用地址:http://dyxdggzs.com/article/149020.htm
6 結束語(yǔ)
在A(yíng)RM-Linux平臺上,通過(guò)使用Video4Linux的API函數從視頻設備中讀取圖像數據,并對圖進(jìn)行了JPEG格式壓縮,再將數據進(jìn)行顯示處理,為后續的轉轍機缺口檢測的上傳功能實(shí)現奠定了基礎。系統若配合使用可靠的傳輸技術(shù)與先進(jìn)的上位機圖像處理系統,將使轉轍機缺口監測系統得以實(shí)現。
評論