OpenCV学习笔记(三十五)——用Qt做摄像头读取

之前介绍了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();

paintEvent函数是重载的,目的是为了更新绘图,在其定义中添加:

void camCapture::paintEvent(QPaintEvent * e)
{
	// 更新图像
	QPainter painter(this);
	painter.drawImage(QPoint(0, 12), *image);
}

camCapture的构造函数里面添加如下初始化代码:

// 初始化处理,建立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();
		}
	}

析构函数里释放timer和image变量。

nextFrame函数实现数据的更新:

// 更新数据
	capture >> frame;
	if (!frame.empty())
	{
		cv::cvtColor(frame, frame, CV_BGR2RGB);
		cv::flip(frame, frame, 1);
		this->update();
	}

这里我又想起来了我当时做图片读取的时候把参数CV_BGR2RGB、Format_RGB888改为了CV_BGR2RGBA、Format_RGB32,但这次试验发现那组参数可能只对我试验的图片有效,对视频还是CV_BGR2RGB、Format_RGB888这组参数是能用的

还有一点很不爽,就是添加函数nextFrame和重载paintEvent函数都找不到向导,都是我自己敲进去的,可能是我的开发环境VS对Qt工程的支持不够霸气,以后可能要果断使用QtCreator了。我是Qt方面的真菜鸟,要是有经验的朋友可以给我说说怎么在VS环境里找到添加Qt事件的向导。万分感谢。

欢迎大家下载http://download.csdn.net/detail/yang_xian521/3882970

你可能感兴趣的:(UI,timer,image,qt,图形,Signal)