Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36833
  • 博文数量: 23
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 137
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-07 10:58
个人简介

http://blog.csdn.net/shanshanpt/article/details/7419184

文章存档

2017年(22)

2012年(1)

我的朋友

分类: 嵌入式

2017-02-09 14:36:01

前言

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

一、摄像头的数据采集

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

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

这样前期的采集基本完成了,把转化后的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);


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

阅读(2375) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~