Linux 下基于ARM920T 的USB 攝像頭圖像采集
3.1圖像數(shù)據(jù)的采集過程:
第一步:要打開攝像頭設(shè)備,而在Linux下可以通過系統(tǒng)的設(shè)備文件來(lái)訪問設(shè)備,在前面我們創(chuàng)建并建立了攝像頭的設(shè)備文件,所以文件描述符(dev)可以如下方法獲?。?P> while (max_try) {
dev = open (device, O_RDWR);
if (dev == -1) {
if (!--max_try) {
fprintf (stderr, "Can't open device %sn", device);
return (1);} /*max_try為試圖打開設(shè)備的最多次數(shù)*/
sleep (1);
} else { break; }}
第二步:進(jìn)行訪問攝像頭設(shè)備的狀態(tài)信息。
首先我們可以在kernel的源代碼中找到頭文件videodev.h,這個(gè)頭文件定義了我們要編寫的應(yīng)用程序的所有數(shù)據(jù)結(jié)構(gòu)和函數(shù)。當(dāng)然我們先要獲得攝像頭的信息,可以通過頭文件中的video_capability結(jié)構(gòu)來(lái)了解攝像頭的性能。其函數(shù)接口是int v4l_check_size (int fd, int *width, int *height),讀出其中的單元可按如下方法,宏VIDIOCGCAP定義為 _IOR('v',1,struct video_capability)。
struct video_capability vid_caps;
if (ioctl (fd, VIDIOCGCAP, vid_caps) == -1) {
perror ("ioctl (VIDIOCGCAP)"); return -1;}
然后通過訪問結(jié)構(gòu)體vid_caps就可以讀出攝像頭可拍攝的圖片類型、圖片的最大最小高度和寬度。
第三步:通過控制攝像頭來(lái)采集圖象數(shù)據(jù)。
實(shí)現(xiàn)函數(shù)為image = get_image (dev, width, height, palette, size),通過該函數(shù)可以將設(shè)備文件中的圖象數(shù)據(jù)的信息讀出來(lái),該函數(shù)的返回值image為圖片要存儲(chǔ)的格式,例如png、jpeg等。但這樣必須首先申請(qǐng)一塊足夠大的內(nèi)存空間,我們是這樣完成的:
map = malloc (width * height * bytes);
len = read (dev, map, width * height * bytes);
if (len = 0) { free (map); return (NULL); }
這樣采集到的圖像數(shù)據(jù)就會(huì)先存到所分配到的內(nèi)存空間中,然后進(jìn)行下一步的象素和圖片格式存儲(chǔ)處理。
第四步:按照預(yù)定的象素值和圖片格式來(lái)存儲(chǔ)圖像。
在驅(qū)動(dòng)程序向應(yīng)用程序傳遞圖像數(shù)據(jù)是一個(gè)拷貝過程,所以應(yīng)用程序在采集圖片數(shù)據(jù)時(shí),先將驅(qū)動(dòng)程序中圖片緩沖區(qū)中的數(shù)據(jù)拷貝到應(yīng)用程序中,然后再控制和處理圖片數(shù)據(jù)。
if (palette == VIDEO_PALETTE_YUV420P) {
convmap = malloc ( width * height * bytes );
v4l_yuv420p2rgb (convmap, map, width, height, bytes * 8);
memcpy (map, convmap, (size_t) width * height * bytes);
free (convmap); }
這就是拷貝的過程,memcpy()為拷貝函數(shù),v4l_yuv420p2rgb()函數(shù)用來(lái)將原生圖片轉(zhuǎn)換為RGB格式的圖像信息。然后通過前邊image的返回值來(lái)分別調(diào)用函數(shù)put_image_png,put_image_jpeg來(lái)生成相應(yīng)格式的圖像信息。
3.2 通過QT編譯的圖片查看器查看攝像頭采集的圖像。
QT目前是在嵌入式Linux領(lǐng)域中比較流行的圖形開發(fā)工具,在我們的文件系統(tǒng)中,采用了基于QT的圖形界面Qtopia,以下是實(shí)現(xiàn)調(diào)用圖像信息的QT語(yǔ)句。第一句表示將圖片的路徑以及圖片的名字傳給pm1,然后通過Qlabel類的pl傳出圖片給圖片查看器,從而實(shí)現(xiàn)了圖像信息的顯示。
QPixmap pm1("picture_path/picture_name");
Qlabel p1;
p1—>SetPixmap(pm1);
在采集的圖像數(shù)據(jù)中,可以自定義所存儲(chǔ)的圖片格式,大小及其像素,方便迅速,而Qtopia是基于QT的比較成熟的嵌入式圖形界面,利用其來(lái)顯示我們所采集的圖像數(shù)據(jù)效果良好。
4、結(jié)束語(yǔ)
本文詳細(xì)介紹了基于ARM920T的嵌入式Linux下的USB攝像頭圖像采集的硬件、軟件構(gòu)建過程,可以靈活應(yīng)用于基于嵌入式的各種電子產(chǎn)品中。由于所采用的軟件全部是開放源碼而且免費(fèi)獲得,所以對(duì)于需要便攜好而又要有較高的數(shù)據(jù)處理能力且成本要求嚴(yán)格的方面尤其適合。
本文作者創(chuàng)新點(diǎn):通用串行總線是一種非常實(shí)用的通信接口,其應(yīng)用日益廣泛,而Linux+ARM9下USB設(shè)備的應(yīng)用也逐漸完善;并且采用了具有永久性存儲(chǔ)功能的Yaffs文件系統(tǒng),為客戶進(jìn)行實(shí)時(shí)處理圖像提供了方便;同時(shí)使用QT編譯的圖像采集界面使圖像數(shù)據(jù)的采集更加人性化,這幾方面的結(jié)合使其必有很廣的市場(chǎng)前景。
參考文獻(xiàn):
[1] SAMSUNG主頁(yè):http://www.samsungsemi.com/
[2]《基于ARM-Linux 嵌入式系統(tǒng)引導(dǎo)程序的設(shè)計(jì)》劉晶晶《微計(jì)算機(jī)信息》2006第2-2期
[3]《構(gòu)建嵌入式Linux系統(tǒng)》,Karim Yaghmour著,中國(guó)電力出版社
[4]《Linux設(shè)備驅(qū)動(dòng)程序(第三版),Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman著,魏永明等譯,中國(guó)電力出版社
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論