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 (将#修改为@)