新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Linux 下基于ARM920T 的USB 攝像頭圖像采集

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

        作者: 時間:2012-05-21 來源:網絡 收藏

        3.1圖像數據的采集過程:

        第一步:要打開攝像頭設備,而在下可以通過系統的設備文件來訪問設備,在前面我們創建并建立了攝像頭的設備文件,所以文件描述符(dev)可以如下方法獲取:

        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為試圖打開設備的最多次數*/

        sleep (1);

        } else { break; }}

        第二步:進行訪問攝像頭設備的狀態信息。

        首先我們可以在kernel的源代碼中找到頭文件videodev.h,這個頭文件定義了我們要編寫的應用程序的所有數據結構和函數。當然我們先要獲得攝像頭的信息,可以通過頭文件中的video_capability結構來了解攝像頭的性能。其函數接口是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;}

        然后通過訪問結構體vid_caps就可以讀出攝像頭可拍攝的圖片類型、圖片的最大最小高度和寬度。

        第三步:通過控制攝像頭來采集圖象數據。

        實現函數為image = get_image (dev, width, height, palette, size),通過該函數可以將設備文件中的圖象數據的信息讀出來,該函數的返回值image為圖片要存儲的格式,例如png、jpeg等。但這樣必須首先申請一塊足夠大的內存空間,我們是這樣完成的:

        map = malloc (width * height * bytes);

        len = read (dev, map, width * height * bytes);

        if (len = 0) { free (map); return (NULL); }

        這樣采集到的圖像數據就會先存到所分配到的內存空間中,然后進行下一步的象素和圖片格式存儲處理。

        第四步:按照預定的象素值和圖片格式來存儲圖像。

        在驅動程序向應用程序傳遞圖像數據是一個拷貝過程,所以應用程序在采集圖片數據時,先將驅動程序中圖片緩沖區中的數據拷貝到應用程序中,然后再控制和處理圖片數據。

        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()為拷貝函數,v4l_yuv420p2rgb()函數用來將原生圖片轉換為RGB格式的圖像信息。然后通過前邊image的返回值來分別調用函數put_image_png,put_image_jpeg來生成相應格式的圖像信息。

        3.2 通過QT編譯的圖片查看器查看攝像頭采集的圖像。

        QT目前是在嵌入式領域中比較流行的圖形開發工具,在我們的文件系統中,采用了基于QT的圖形界面Qtopia,以下是實現調用圖像信息的QT語句。第一句表示將圖片的路徑以及圖片的名字傳給pm1,然后通過Qlabel類的pl傳出圖片給圖片查看器,從而實現了圖像信息的顯示。

        QPixmap pm1("picture_path/picture_name");

        Qlabel p1;

        p1—>SetPixmap(pm1);

        在采集的圖像數據中,可以自定義所存儲的圖片格式,大小及其像素,方便迅速,而Qtopia是基于QT的比較成熟的嵌入式圖形界面,利用其來顯示我們所采集的圖像數據效果良好。

        4、結束語

        本文詳細介紹了基于ARM920T的嵌入式下的的硬件、軟件構建過程,可以靈活應用于基于嵌入式的各種電子產品中。由于所采用的軟件全部是開放源碼而且免費獲得,所以對于需要便攜好而又要有較高的數據處理能力且成本要求嚴格的方面尤其適合。

        本文作者創新點:通用串行總線是一種非常實用的通信接口,其應用日益廣泛,而Linux+ARM9下USB設備的應用也逐漸完善;并且采用了具有永久性存儲功能的Yaffs文件系統,為客戶進行實時處理圖像提供了方便;同時使用QT編譯的界面使圖像數據的采集更加人性化,這幾方面的結合使其必有很廣的市場前景。

        參考文獻:

        [1] SAMSUNG主頁:http://www.samsungsemi.com/

        [2]《基于ARM-Linux 嵌入式系統引導程序的設計》劉晶晶《微計算機信息》2006第2-2期

        [3]《構建嵌入式Linux系統》,Karim Yaghmour著,中國電力出版社

        [4]《Linux設備驅動程序(第三版),Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman著,魏永明等譯,中國電力出版社

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 杭锦后旗| 罗田县| 秭归县| 嘉善县| 松溪县| 报价| 郴州市| 五家渠市| 龙南县| 修文县| 长阳| 灵武市| 和田市| 伊吾县| 刚察县| 禄丰县| 贞丰县| 恩平市| 常熟市| 辽阳县| 油尖旺区| 碌曲县| 安阳县| 屯留县| 英德市| 邹平县| 微博| 枝江市| 贵南县| 甘南县| 醴陵市| 襄汾县| 鹤峰县| 祁连县| 扎鲁特旗| 济南市| 肇庆市| 那曲县| 思茅市| 盈江县| 若羌县|