http://blog.csdn.net/shanshanpt/article/details/7419184
分类: 嵌入式
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刷新显示,你的去建立一个线程,把采集的视频数据不断刷新到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 &)));
这里label的刷新显示,如果你摄像头采集的分辨率和你的LCD屏大小不同,例如,摄像头采集的分辨率是640X480,但你现在的LCD屏是800X480的,这时候如果你需要显示全屏,你需要的让lable自动伸缩:void MainWindow::show_picture(const QImage &img){ui->show_label->setPixmap(QPixmap::fromImage(img));}
ui->show_label->setScaledContents(true);
ui->show_label->setFixedSize(800,480);
无论你摄像头是什么样的分辨率,用这个就可以实现全屏了。