问题描述
之前写了这样一篇文章: V4L2+QT+USB摄像头实时显示视频(Arm,Linux,window均适用)
程序运行在Linux系统中,视频不掉帧,显示很稳定;但是编译之后运行在Arm9开发板时,能感到明显的延迟
解决问题过程中发现这样一个论坛: Qt用QLabel来显示摄像头,CPU占用率过高的问题,定时器变不准
总结一下内容:
- QLabel控件不适合做频繁刷新的图像显示,没有效率;
- 可以开多线程来解决显示问题
- 可用QPixmap+QPainter替代QLabel控件
不妨尝试用多线程+QPainter来显示视频帧
编程
QPainter显示图像
首先是QPainter显示图像,先学习一下 QPainter Class,核心代码
/* 显示的每帧图像 */
QImage img;
/* 重写父类下的protected方法*/
protected:
void paintEvent(QPaintEvent *);
......
void videoshow::paintEvent(QPaintEvent *){
try{
QPainter painter(this);
if(!img.isNull()){
painter.drawImage(QPointF(0,0),img);
}
}catch(...){}
}
这里选择不缩放显示图像,参考以下函数
QThread线程开启
官方文档: QThread Class
QT使用线程主要有两种方法,其中之一就是继承QThread,然后重写run()
的方法
class V4l2Thread : public QThread{
public:
explicit V4l2Thread(QWidget *parent = 0);
~V4l2Thread();
/* QThread 虚函数 run */
void run();
}
void V4l2Thread::run(){
/* V4l2的编程就可以写在`run()`函数中 */
}
线程的启动start()
,线程的销毁destroyed()
/* 实例化V4l2Thread */
t = new V4l2Thread();
......
t.start();
......
t->destroyed();