之前介绍了Qt+OpenCV的图形界面设计http://blog.csdn.net/yang_xian521/article/details/6968012,那篇里面只是读取了图片,这次再略进一步,再实现一个摄像头视频的读取。
再介绍一下我的开发环境Qt4.7.4+OpenCV2.3.1+VS2008,其实很简单,先在自己的QMainWindow子类里面声明如下变量:
public: camCapture(QWidget *parent = 0, Qt::WFlags flags = 0); ~camCapture(); protected: void paintEvent(QPaintEvent * e); private: Ui::camCaptureClass ui; cv::Mat frame; cv::VideoCapture capture; QImage *image; QTimer *timer; private slots: void nextFrame();
void camCapture::paintEvent(QPaintEvent * e) { // 更新图像 QPainter painter(this); painter.drawImage(QPoint(0, 12), *image); }
// 初始化处理,建立QImage和frame的关联,开启定时器 capture.open(-1); if (capture.isOpened()) { capture >> frame; if (!frame.empty()) { cv::cvtColor(frame, frame, CV_BGR2RGB); cv::flip(frame, frame, 1); image = new QImage((const unsigned char*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888); timer = new QTimer(this); timer->setInterval(30); connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame())); timer->start(); } }
nextFrame函数实现数据的更新:
// 更新数据 capture >> frame; if (!frame.empty()) { cv::cvtColor(frame, frame, CV_BGR2RGB); cv::flip(frame, frame, 1); this->update(); }
还有一点很不爽,就是添加函数nextFrame和重载paintEvent函数都找不到向导,都是我自己敲进去的,可能是我的开发环境VS对Qt工程的支持不够霸气,以后可能要果断使用QtCreator了。我是Qt方面的真菜鸟,要是有经验的朋友可以给我说说怎么在VS环境里找到添加Qt事件的向导。万分感谢。
欢迎大家下载http://download.csdn.net/detail/yang_xian521/3882970