天天看点

智能家居实训第八天 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源代码

继续阅读