天天看點

智能家居實訓第八天 JPG庫 和攝像頭使用

一:JPG庫----》jpg或者jpeg圖檔-----》液晶

      jpg檔案是有損的

      jpg是24位顔色圖

    JPEG格式:經過壓縮-----》使用算法還原回RGB

    JPEG壓縮算法:開源的第三庫

                      開源的第三方庫

    經過壓縮JPEG格式------------------》RGB------>lcd液晶螢幕

   1)下載下傳飛秋的JPEG庫:jpegsrc.v9a.tar.gz

   2) 把jpegsrc.v9a.tar.gz放置共享目錄 

   3)在Ubuntu中,回到JPEG庫所在的位置

          cd  /mnt/hgfs/linux/jpegsrc.v9a.tar.gz

   4)解壓到家目錄中

     tar zxvf  jpegsrc.v9a.tar.gz -C ~

     其中: 

          tar:解壓或者壓縮的指令

          z  :解壓以.gz結尾的壓縮包  j----》.bz2

          x  :解壓                   c----》壓縮

          v  :可見的方式進行解壓(把解壓縮的過程列印出來)

          f  :檔案

          -C :指定你解壓的路徑

          ~  :指定解壓到位置

   5)回到家目錄下,看看是否解壓成功

         回家目錄  cd

                   ls-----》是否有jpeg-9a----》解壓成功

   6)在家目錄中建立一個新的目錄,作為jpeg庫安裝

          回家目錄 cd

           mkdir   jpg

           chmod  777 jpg

    7)切換到解壓後目錄

          cd  ~/jpeg-9a

    8)配置

      ./configure  --host=arm-linux --prefix=/home/gec/jpg

    9)編譯

       make

    10)安裝

       make install

    11)檢查是否安裝成功

          cd ~/jpg

          ls          

          bin:二進制檔案

          include:頭檔案

         jconfig.h  jerror.h  jmorecfg.h  jpeglib.

          lib:庫檔案

            libjpeg.so.9.1.0----》jpeg算法庫

          share:幫助文檔

    12)下載下傳飛秋的jpeg_show.c檔案

           jpeg開放源碼:jpeg_show.c

    13)把jpeg_show.c放置到共享目錄

    14)去Ubuntu中,回到jpeg_show.c所在路徑下面

         cd  /mnt/hgfs/linux/

    15)編譯工程

     arm-linux-gcc jpeg_show.c -o jpeg_show 

     -I /home/gec/jpg/include -L /home/gec/jpg/lib/ -ljpeg

        arm-linux-gcc jpeg_show.c -o jpeg_show  編譯指令

        -I /home/gec/jpg/include :指定頭檔案的路徑

        -L /home/gec/jpg/lib/    :指定庫檔案的路徑

        -ljpeg                     :指定連結庫jpeg

    16)把jpeg_show拷貝到開發闆中

           rx 

    17)修改權限

            chmod 

    18)執行

         ./jpeg_show 1.jpg     

    [[email protected] /]#./jpeg_show 1.jpg 

   ./jpeg_show: error while loading shared libraries:

    libjpeg.so.9: cannot open shared object file:

    No such file or directory      

         解決方案:把libjpeg.so.9.1.0 下載下傳到開發闆

    19)先拷貝libjpeg.so.9.1.0到共享目錄

    20)将庫拷貝到CRT當中去;

          mv libjpeg.so.9.1.0 /lib

          并且将名字改為libjpeg.so.9

    21)重新執行工程

===================攝像頭=====================

1.在linux中那些常用的應用裝置

  液晶顯示螢幕、鍵盤、滑鼠、觸摸屏、攝像頭、U盤等

  linux前輩設計很多的模型

       1.友善我們去調用驅動

       2.按部就班的操作

=============================================

2.由于這種原因我們在寫的時候就可以按照模型的“套路”

   頭檔案指定庫指定我們需要的路徑

   宏定義包含了所有的狀态

   函數主體

         1.打開檔案(open 驅動)

         2.代碼功能子產品

         3.關閉檔案

=============================================

3.linux當中有關視訊類的裝置------》攝像頭  統一的架構(V4l2)

  使程式有發現裝置和操作裝置的能力。

  它主要用一系列的函數實作我們想要的功能。

  像設定攝像頭的參數、幀頻、視訊壓縮格式和圖像參數等。

  當然統一的架構隻能在linux作業系統

      linux系統中有一個頭檔案和V4L2架構是相關的

        vi /usr/include/linux/videodev2.h 

=============================================

4.幀捕捉畫面

  幀——就是影像動畫中最小機關的單幅影像畫面,

  相當于電影膠片上的每一格鏡頭。 

  一幀就是一副靜止的畫面,連續的幀就形成動畫

=============================================

5.攝像頭操作流程:

    1.打開裝置檔案。 int fd=open("/dev/video7",O_RDWR);

                 注意(等開發闆開啟之後在插攝像touch)

    2. 取得裝置的capability,看看裝置具有什麼功能,

    比如是否具有視訊輸入,或者音頻輸入輸出等。VIDIOC_QUERYCAP,struct v4l2_capability(可選)

    3. 選擇視訊輸入,一個視訊裝置可以有多個視訊輸入。VIDIOC_S_INPUT,struct v4l2_input

    4. 設定視訊的制式和幀格式,制式包括PAL,NTSC,

      幀的格式個包括寬度和高度等。

    VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format

    5. 向驅動申請幀緩沖,一般不超過5個。

        struct v4l2_requestbuffers

    6. 将申請到的幀緩沖映射到使用者空間,

       這樣就可以直接操作采集到的幀了,而不必去複制。

    7. 将申請到的幀緩沖全部入隊列,以便存放采集到的資料.

        VIDIOC_QBUF,struct v4l2_buffer

    8. 開始視訊的采集。VIDIOC_STREAMON

    9. 出隊列以取得已采集資料的幀緩沖,取得原始采集資料。

       VIDIOC_DQBUF

    10. 将緩沖重新入隊列尾,這樣可以循環采集。VIDIOC_QBUF

    11. 停止視訊的采集。VIDIOC_STREAMOFF

    12. 關閉視訊裝置。close(fd);

=======================================

攝像頭:

    1.驅動/dev/video7

    2.使用結構體

    typedef struct Frame_Buffer

    {

        char buf[1843200]; //攝像頭捕捉的資料顯示(jpg:600*480)

        int length;        //攝像頭捕捉的資料大小    

    }FrameBuffer;

    3.代碼功能子產品

     //初始化攝像頭

     int linux_v4l2_device_init(const char *dev);

     //開啟攝像頭捕捉

     int linux_v4l2_start_capturing();

     //擷取攝像頭的畫面

     int linux_v4l2_get_fream(FrameBuffer *freambuf);

     //攝像頭顯示畫面

     int show_video_data(unsigned int x,unsigned int y,

            char *pjpg_buf,unsigned int jpg_buf_size)  

     //攝像頭暫停捕捉

      int linux_v4l2_stop_capturing();

     //解除攝像頭的初始化 

     int linux_v4l2_device_uinit();

====================================

頭檔案:

      什麼時候用<.h>  頭檔案存在系統庫裡面

      什麼時候用".h"  頭檔案不在系統庫,根據目前目錄查找

編譯指令

   arm-linux-gcc *.c -o viode_show -L./jpeg -lapi_v4l2_arm -I./jpeg -ljpeg

github源代碼

繼續閱讀