<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux 下基于ARM920T 的USB 攝像頭圖像采集

          Linux 下基于ARM920T 的USB 攝像頭圖像采集

          作者: 時(shí)間:2012-05-21 來(lái)源:網(wǎng)絡(luò) 收藏

          3.1圖像數(shù)據(jù)的采集過程:

          第一步:要打開攝像頭設(shè)備,而在下可以通過系統(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目前是在嵌入式領(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的嵌入式下的的硬件、軟件構(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不再難懂)

          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: USB攝像頭 Linux 圖像采集

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();