这几天需要做一个视频文件录制功能。用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::writeVideo(const ETVideoSource &source, QSize size, CvVideoWriter *p

在使用Qt调用OpenCV录制视频时遇到cvWriteFrame函数导致的内存错误。经过分析,发现Qt的浅复制机制在与OpenCV结合时产生了问题。通过修改代码,解决了这个问题,确保了视频录制的正常运行。
最低0.47元/天 解锁文章
1989





