Qt中的摄像头显示,jpeg图片显示(jpeg库的移植和使用),Qt容器框架篇

QT中的容器

QT中的容器跟C++容器的用法几乎一模一样

    1.对比

  •           vector          QVector
  •           set               QSet
  •           list               QList
  •           map             QMap
  •           stack            QStack
  •           queue          QQueue

QT中的摄像头显示

1. 涉及到类

QT += multimedia
QT += multimediawidgets
QCameraInfo       //获取当前系统所有的摄像头信息
QCamera             //表示摄像头对象
QVideoWidget    //表示摄像头拍摄画面的显示窗口

2. 思路和步骤

(1)获取当前系统中所有的摄像头信息

[static] QList<QCameraInfo> QCameraInfo::availableCameras()
  返回值:容器,存放了所有的摄像头信息
QString QCameraInfo::description() const
  返回值:摄像头的描述信息
QString QCameraInfo::deviceName() const
  返回值:摄像头的设备名称

(2)定义QCamera对象

QCamera::QCamera(const QByteArray &deviceName)
    参数:依据摄像头的设备名字构造一个摄像头对象

(3)准备好摄像头显示需要用到的窗口(创建QVideoWidget对象跟你在ui中拖过来的QWidget绑定在一起)  

QVideoWidget::QVideoWidget(QWidget *parent = nullptr)
      参数:parent --》把你在ui中拖过来的QWidget对象作为实参

把摄像头跟窗口也绑定((照相机的)取景器):

void QCamera::setViewfinder(QVideoWidget *viewfinder)
     参数:viewfinder--》你刚才准备好的那个窗口

调整窗口的大小,让窗口给QWidget大小保持一致

void QWidget::resize(int w, int h)

显示窗口

void QWidget::show()

启动摄像头

void QCamera::start()

(4)关闭摄像头    

void QCamera::stop()

3.QT中的摄像头类和代码不能在ARM平台上运行

原因:QT的摄像头类不支持V4L2架构

V4L2摄像头代码融入到QT工程中

   项目阶段(在开发板上运行):需要用到摄像头

   1.思路 

              跟QT控制硬件的思路类似,把摄像头代码(C语言)改写成C++(封装成C++的一个类)

笔试题+复习

    1.C++关键字

          explicit   //禁止隐式转换

       父类指针=子类对象的地址

   2.笔试题

          int a=1;

          int b=0;

          int c=(a,b++);   //   (a,b++)逗号表达式,从左到右计算,最终式子的结果由最右边的式子决定

             a?    b?   c?

             1      1     1

             1      1     0

jpeg库的移植和使用

1.libjpeg移植【资源会在本基础教程编写完时公布,需要有序整理。】

(1)解压jpeg的源码包,然后执行configure


./configure  --prefix=/home/gec/xxx    CC=arm-linux-gcc  --host=arm-linux   --enable-shared --enable-static
   --prefix  指定编译得到的库文件,头文件所在的位置
   --enable-shared  生成动态库
   --enable-static    生成静态库

 (2)make && make install

make  编译库
    make install   把编译产生的库文件头文件安装到第一步你指定的目录下

2. 使用jpeg库提供的接口函数显示jpg图片

jpg图片的背景知识:jpg图片采用特殊的算法压缩过,占用的存储空间很小,很适合在网络上传输

大致思路:jpg原始数据还原出来(解压缩) –》得到原始的RGB数据–》原始的RGB转换成ARGB填充到开发板的lcd上

3.显示思路

第一步:定义解压缩结构体变量和处理错误的结构体变量,并初始化     


struct jpeg_decompress_struct    解压缩结构体
{
       image_width;  //图片宽
       image_height;  //图片高
       num_components;  //图片的色深(3个字节),每个像素点占用的字节数
       err;   //保存jpeg_std_error()返回值
}
jpeg_create_decompress(cinfo)
            参数:cinfo --》解压缩结构体指针
struct jpeg_error_mgr   处理错误的结构体
{


}
jpeg_std_error(structjpeg_error_mgr * err);
            参数:err --》保持错误信息的结构体指针

  第二步:指定解压缩数据源


fopen(你要显示的那张jpg图片)
jpeg_stdio_src(j_decompress_ptrcinfo, FILE * infile);
            参数:cinfo --》解压缩结构体指针
                      infile --》你刚才打开的那张图片

第三步:读取jpg图片的头信息

jpeg_read_header(j_decompress_ptr cinfo,booleanrequire_image)
      参数:cinfo --》解压缩结构体指针
require_image --》true

第四步:开始解压缩得到jpg原始的RGB数据

 jpeg_start_decompress(j_decompress_ptr cinfo);  
     参数:cinfo --》解压缩结构体指针

 第五步:关键步骤,读取解压缩得到的RGB数据,把数据填充到开发板的lcd上


jpeg_read_scanlines(j_decompress_ptr cinfo, JSAMPARRAY scanlines,JDIMENSION max_lines)
参数:cinfo --》解压缩结构体指针
     scanlines --》存放读取到解压缩后的RGB数据
     max_lines --》你读取多少行RGB数据,一般一次读取一行    
char*buf=malloc(一行RGB数据大小);       
for(i=0; i<图片高; i++)
{
          jpeg_read_scanlines(&mydem,&buf,1);  //一次读取一行
         //立马把buf中的一行RGB数据填充到开发板的lcd上
}    

第六步:收尾

jpeg_finish_decompress(j_decompress_ptr cinfo); 
jpeg_destroy_decompress(j_decompress_ptr cinfo); 

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论