如何解决OpenCV VideoWriter C ++无法写入Output.avi
我正在尝试使用C ++中的cv VideoWriter编写带帧并将其写入输出文件.avi / .mp4的代码。
系统设置为Linux Ubuntu 18.04.4 LTS,Qt 5.9.5(GCC 7.3.0,64位)
我正在从相机获取帧,将其转换为QImage并很好地在GUI上显示。
void FrameThread::run()
{
while (m_isWaitting)
{
if (SUCCESS == Buf_WaitForFrame(m_Cam,&m_frame))
{
int channels = m_frame.ucChannels;
int width = m_frame.usWidth;
int height = m_frame.usHeight;
int elementBytes = m_frame.ucElemBytes;
QImage img;
img = QImage(width,height,QImage::Format_Grayscale8);
uchar *pSrc = (uchar *)m_frame.pBuffer + m_frame.usHeader;
uchar *pDst = (uchar *)img.bits();
if (2 == elementBytes)
{
pSrc += (elementBytes / 2);
if (1 == channels)
{
int pixels = width * height * channels;
for (int i = 0; i < pixels; ++i)
{
*pDst++ = *pSrc;
pSrc += elementBytes;
}
}
}
emit signalUpdateImage(img);
if (m_isSaving)
{
saveImage();
}
if (m_isRecording)
{
if(!m_isCreateVideoWriter)
{
QString savedpath = "/home/nvidia/Pictures/";
CvSize size = cvSize(2048,1148);
char cur[1024];
timespec time;
clock_gettime(CLOCK_REALTIME,&time);
tm Nowtm;
localtime_r(&time.tv_sec,&Nowtm);
sprintf(cur,"%s%04d%02d%02d%02d%02d%02d.avi",savedpath.toLocal8Bit().data(),Nowtm.tm_year+1900,Nowtm.tm_mon+1,Nowtm.tm_mday,Nowtm.tm_hour,Nowtm.tm_min,Nowtm.tm_sec);
video = cv::VideoWriter(cur,cv::VideoWriter::fourcc('M','J','P','G'),25.0,size,1);
m_isCreateVideoWriter = true;
}
else
{
//Clicked 'Stop Record' button
//Close video writer
if (CamObject::getInstance()->m_bFinishRec)
{
video.release();
m_isRecording = false;
m_isCreateVideoWriter = false;
return;
}
// Recording...
else
{
videoFrame = QImagetoCvMat(img);
video.write(videoFrame);
}
}
}
}
}
}
我还创建了QImagetoCvMat方法,因为它们不是QImage的写方法:
cv::Mat QImagetoCvMat(QImage &inImage)
{
cv::Mat mat(inImage.height(),inImage.width(),CV_8UC1,inImage.bits(),inImage.bytesPerLine());
return mat;
}
video.write(videoFrame);
任何熟悉此问题的人或可以提出建议吗?另一种创建视频文件的方式?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。