QT 框架中快速应用OpenCV 基于视频播放

转载 2013年12月05日 14:31:50

QT 框架中快速应用OpenCV 基于视频播放是本篇介绍的内容,接着上篇文章继续介绍,希望上篇文章对你有帮助,那么先来看本篇文章!

有些时候我们需要的是处理视频文件,比如AVI,当然也不过是图像序列。在由于QT运行时的多线程机制导致sleep函数不好使,可以通过其提供的QTimer来控制视频文件的播放。在给出例子之前要罗嗦两句QT的信号/槽机制。MFC里面的消息映射固然很快,但是让一个涉其未深的人阅读起来会觉得很晦涩,QT通过signal/slot机制实现了消息交换。用signal唤起slot,比如点击了button的clicked()事件是一个signal,当这个事件发生之后可以唤起其他的操作,只要你将clicked消息和那个实际操作的槽连接起来了。

opencv里面有函数可以方便的读取视频帧,如果使用Widget播放视频,如何控制帧率是一个很巧妙的地方,我使用一个QTimer控制时间(可以理解为帧率),并周期性的唤起读取视频帧的操作,然后在这个操作里面对widget进行重绘,或者模仿前面的方法,用一个QImage当作共享区域,让用来paintEvent用来显示。

有了上面显示图像的基础,我改一下上面的代码,给出一个例子:

  1. myWidget.h  
  2. #ifndef MYWIDGET_H  
  3. #define MYWIDGET_H  
  4. #include <QtGui\QWidget> 
  5. #include <QtGui\QPaintEvent> 
  6. #include <QtGui\QImage> 
  7. #include <QtCore\QTimer> 
  8. #include <cv.h> 
  9. #include <highgui.h> 
  10. class myWidget : public QWidget  
  11. {  
  12.  Q_OBJECT  
  13. public:  
  14.  myWidget(const char *filename,QWidget *parent = 0);  
  15.  ~myWidget();  
  16. protected:  
  17.  void paintEvent(QPaintEvent *e);  
  18. private slots:  
  19.  void nextFrame();  
  20. private:  
  21.  CvCapture *capture;  
  22.  IplImage *iplImg;  
  23.  IplImage *frame;  
  24.  QImage *qImg;  
  25.  QTimer *timer;  
  26. };  
  27. #endif  
  28. myWidget.cpp  
  29. #include "myWidget.h"  
  30. #include <QtGui\QPainter> 
  31. #include <QtCore\QPoint> 
  32. myWidget::myWidget(const char *filename,QWidget *parent /* = 0 */) : QWidget(parent)  
  33. {  
  34.  capture = cvCaptureFromFile(filename);  
  35.  if (capture)  
  36.  {  
  37.   frame = cvQueryFrame(capture);  
  38.   if (frame)  
  39.    this->resize(frame->width,frame->height);  
  40.   qImg = new QImage(QSize(frame->width,frame->height),  
  41.    QImage::Format_RGB888);  
  42.   iplImg = cvCreateImageHeader(cvSize(frame->width,frame->height),  
  43.    8,3);  
  44.   iplImg->imageData = (char*)qImg->bits();  
  45.   timer = new QTimer(this);  
  46.   timer->setInterval(30);  
  47.   connect(timer,SIGNAL(timeout()),this,SLOT(nextFrame()));  
  48.   timer->start();  
  49.  }  
  50.  
  51. }  
  52. myWidget::~myWidget()  
  53. {  
  54.  cvReleaseImage(&iplImg);  
  55.  cvReleaseCapture(&capture);  
  56.  delete qImg;  
  57.  delete timer;  
  58.  
  59. }  
  60. void myWidget::paintEvent(QPaintEvent *e)  
  61. {  
  62.  QPainter painter(this);  
  63.  painter.drawImage(QPoint(0,0),*qImg);  
  64. }  
  65. void myWidget::nextFrame()  
  66. {  
  67.  frame = cvQueryFrame(capture);  
  68.  if (frame)  
  69.  {  
  70.   if (frame->origin == IPL_ORIGIN_TL)  
  71.   {  
  72.    cvCopy(frame,iplImg,0);  
  73.   }  
  74.   else  
  75.   {  
  76.    cvFlip(frame,iplImg,0);  
  77.   }  
  78.   cvCvtColor(iplImg,iplImg,CV_BGR2RGB);  
  79.   this->update();  
  80.  }  

主函数里面调用

  1. int main(int argc,char* argv[])  
  2. {  
  3.  QApplication app(argc,argv);  
  4.  char *filename = "test.avi";  
  5.  myWidget *mw = new myWidget(filename);  
  6.  mw->show();  
  7.  int re = app.exec();  
  8.  return re;  

由于接不截图都看不出来,所以就不截图。

后一个程序因为涉及到slots,所以添加了一个Q_OBJECT宏,编译之前需要将myWidget.h程序moc一下

比如:

  1. moc myWidget.h –o moc_myWidget.cpp 

这样会在目录下生成一个.cpp文件,make的时候加到源文件里一起make,或者编译的时候添加到源文件列表中去。

知道如何使用QT来显示图像和播放视频之后,在上述代码里面插入处理图像的代码就很简单了。显示图像的时候在构造函数里面就可以插入处理代码,当然也可以在paintEvent函数里面进行处理,播放视频的时候可以在nextFrame函数里面进行处理,有些预处理可以在构造函数里面完成。

相比于MFC的代码,QT的代码结构看上去,很明显,更加优美。

QT框架中快速应用OpenCV——基于视频播放

有些时候我们需要的是处理视频文件,比如AVI,当然也不过是图像序列。在由于QT运行时的多线程机制导致sleep函数不好使,可以通过其提供的QTimer来控制视频文件的播放。在给出例子之前要罗嗦两句QT...
  • DraculaIII
  • DraculaIII
  • 2012年09月01日 17:51
  • 1195

使用Qt5和OpenCV做视频播放器

Qt5 + OpenCV 做视频播放器(不含音频)
  • obervose
  • obervose
  • 2017年04月10日 22:51
  • 1604

QT框架中快速应用OpenCV

http://www.cnblogs.com/khler/archive/2010/07/04/1770886.html 和MFC比较起来,QT的信号槽机制比MFC的信号机制慢,但是因为...
  • zm_nong
  • zm_nong
  • 2012年05月03日 15:08
  • 676

QT 框架中快速应用OpenCV

QT 框架中快速应用OpenCV 基于图片 上篇 详解 QT 框架中快速应用OpenCV 基于视频播放 下篇 Qt 多线程之可重入与线程安全 上篇 Qt 多线程之逐线程事件循环 ...
  • tanmengwen
  • tanmengwen
  • 2013年05月01日 15:02
  • 783

QT框架中快速应用OpenCV——基于图片

QT 框架中快速应用OpenCV 是本文要结束的内容,和MFC比较起来,QT的信号槽机制比MFC的信号机制慢,但是因为能很好的实现跨平台,所以我在这里总结一下可能对一些人有点用。     1.显...
  • DraculaIII
  • DraculaIII
  • 2012年09月01日 17:41
  • 718

QT 框架中快速应用OpenCV 基于图片

1.显示图像 QWidget是QObject下的第一个子类,使用它显示图像会减少不必要的开销。首先定制一个自己需要的QWidget: class myWidget : public QWidg...
  • u012745772
  • u012745772
  • 2013年12月05日 14:30
  • 483

详解 QT 框架中快速应用OpenCV 基于图片

详解 QT 框架中快速应用OpenCV 基于图片 上篇 2011-10-30 23:49 from http://www.51cto.com/php/viewart.php...
  • yangguangyi
  • yangguangyi
  • 2011年11月10日 22:52
  • 224

4412 ARM+OpenCV +QT播放视频

4412 ARM+OpenCV +QT播放视频// myWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H #include ...
  • pc153262603
  • pc153262603
  • 2016年09月19日 16:23
  • 765

MFC中快速应用OpenCV教程

论坛上看到非常经典的VS2008 + OpenCV 2.0下的配置过程: (这里用的是opencv2.0) 1. 文件 | 项目 | MFC | MFC应用程序 |(新名称如MFCtest)|...
  • abcjennifer
  • abcjennifer
  • 2012年01月26日 21:17
  • 6804

基于QT和OpenCV的人脸检测识别系统(2)

紧接着上一篇博客的讲 第二步是识别部分 人脸识别 把上一阶段检测处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸对应的人是谁(此处以白色文本显示)。   人脸预处理 现...
  • chenaini119
  • chenaini119
  • 2014年10月12日 15:08
  • 2335
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT 框架中快速应用OpenCV 基于视频播放
举报原因:
原因补充:

(最多只允许输入30个字)