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

    [root@GEC6818 /]#./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源代码

     
     
     
   
   

你可能感兴趣的:(嵌入式智能家居实训)