您的位置:首页 > 编程语言 > Qt开发

opencv 处理视频并使用Qt窗口作为输出

2016-06-15 20:59 1776 查看
版本: QT 5.6.0 & opencv :3.0.0 windows

曾想到的方法:

使用QT的视频播放类,QMediaplayer,QVideoWidget 并利用Qt的类提取出每一帧然后用opencv加以处理。尚未找到qt用来提取帧的函数。 代替方法:用QAbstractVideoFilter进行视频处理,但不了解该类非qml的使用方法。(弃用)

用QPaint 画出video的每一帧,或者直接用label的setPixmp函数。

方法二在实现过程中遇到的问题记录:

1. 对Mat到QImage 格式转换的过程,涉及到qimage mat对图像不同存储方式的转换。

if(img.channels() == 3)
{
cv::cvtColor(img,img,CV_BGR2RGB);
curImage = QImage((unsigned char *)img.data,img.cols,img.rows,img.step,QImage::Format_RGB888);
}
else
{
curImage = QImage((const unsigned char*)img.data,img.cols,img.rows,img.step,
QImage::Format_RGB888);
}


2.capture >> frame 与 painter.drawImage() (或者label->setPixmap(QPixmap::fromImage(image))的同步问题,加一个QTimer类来控制。 其中用scale来调整image大小 嵌入label内。

timer = new QTimer ;
connect(timer,SIGNAL(timeout()),this,SLOT(changeFrame()));

void MainWindow::changeFrame()
{
capture >> img;
cv::putText(img,"putStasar",cv::Point(200,200),5,4,cv::Scalar(255,0,0));
if(img.channels() == 3) { cv::cvtColor(img,img,CV_BGR2RGB); curImage = QImage((unsigned char *)img.data,img.cols,img.rows,img.step,QImage::Format_RGB888); } else { curImage = QImage((const unsigned char*)img.data,img.cols,img.rows,img.step, QImage::Format_RGB888); }
QImage newImage = curImage.scaled(label->width(),label->height());
label->setPixmap(QPixmap::fromImage(newImage));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt opencv