这几天需要做一个视频文件录制功能。用Qt调用OpenCV代码搞定。
其中线程相关的过程省略不写,与CvVideoWriter生成的部分网上有很多,也省略不写。下面只记录这个写入单帧的函数:
第一版:
//ATTENTION: 调用来自另一线程
bool ETVideoController::writeVideo(const ETVideoSource &source, QSize size, CvVideoWriter *pWriter)
{
QImage img(source.getOneFrame());
// pImageWrite与img共享内存
IplImage* pImageWrite = cvCreateImageHeader(
cvSize(size.width(), size.height()), 8, 3);
pImageWrite->imageData = reinterpret_cast<char*>(img.bits());
cvCvtColor(pImageWrite, pImageWrite, CV_RGB2BGR);
// 写入一帧
cvWriteFrame(pWriter, pImageWrite);
cvReleaseImageHeader(&pImageWrite);
return true;
}
这一版本的代码没有考虑到输入的源图像非24位图的情况,也没有考虑到输入的源图像与视频大小不一致的情况。所以录制后的视频出现了花屏的情况。为改善这一问题,我把代码改成了如下形式:
第二版:
//ATTENTION: 调用来自另一线程
bool ETVideoController::writeV