摄像头采集QT5显示和分辨率适配

来源:互联网 发布:网络信息时代 编辑:程序博客网 时间:2024/05/20 21:05

前言

        随着嵌入式行业的发展,ARM平台上对视频的采集和显示越来越普遍,本文主要讲解使用QT5在LCD屏上实时显示摄像头采集的数据,主要分为两个部分:摄像头的数据采集、QT的刷新显示。

一、摄像头的数据采集

   对于摄像头的数据采集,首先你必须的有驱动,无论是usb摄像头,还是模块摄像头,这个这里就不多说,这里主要讲解使用v4l2对视频的采集,V4L2(Video For Linux Two)是内核提供给应用程序访问音、视频驱动的统一接口,使用V4L2怎么采集到一帧数据的网上资料很多,当然如果你找不到,也可以去下载:

http://download.csdn.net/detail/u012478275/9517727

当你采集到一帧数据:unsigned char *yuyv= (unsigned char *)(cap_buffers[v4l2_buf.index].start);这时候需要对采集数据转换成RGB,一般摄像头输出YUYV(yuv422)和NV12(yuv420),对于YUYV和NV12格式转RGB的代码可以下载:

http://download.csdn.net/detail/u012478275/9517863

这样前期的采集基本完成了,把转化后的rgb格式在QT中刷新显示出来就可以了。

二、QT刷新在LCD中的显示

对于QT刷新显示,你的去建立一个线程,把采集的视频数据不断刷新到lable进行显示,线程的主要程序如下:

    while(!quit_flag)
    {
        m_video.get_data();//获取视频数据
        unsigned char *rgb;
        rgb = new unsigned char [m_video.buf.length*2];//根据yuyv像素点和rgb像素所站内存比分配rgb
        m_video.yuvtorgbO(rgb,640,480);//yuyv转换成RGB
        QImage img = QImage(rgb,640,480,QImage::Format_RGB888);
        emit image_data(img);//发信号到lable显示界面
        msleep(40);
        delete[] rgb;//不能在sleep前释放掉否则显示的图片会出现问题
    }

对于显示界面,主要代码如下:

       connect(video,SIGNAL(image_data(const QImage &)),this,SLOT(show_picture(const QImage &)));
    void MainWindow::show_picture(const QImage &img)
    {
        ui->show_label->setPixmap(QPixmap::fromImage(img));
    }

这里label的刷新显示,如果你摄像头采集的分辨率和你的LCD屏大小不同,例如,摄像头采集的分辨率是640X480,但你现在的LCD屏是800X480的,这时候如果你需要显示全屏,你需要的让lable自动伸缩:
      ui->show_label->setScaledContents(true);
      ui->show_label->setFixedSize(800,480);

无论你摄像头是什么样的分辨率,用这个就可以实现全屏了。



0 0
原创粉丝点击