我有一个简单的程序来拍摄视频并播放(尽管它会对视频进行一些图像处理)。可以从对话框结果中检索视频,也可以直接通过提供文件路径来检索视频。当我使用 cv::CvCapture capture1 时,我得到诸如capture1.isOpen(), capture1.get(CV_CAP_PROP_FRAME_COUNT)等属性,但是当我使用 CvCapture * capture2 时却出现奇怪的错误。

我想使用 cv::CvCapture capture1 ,因为我的功能与 capture1 一致。或者有没有办法使用两种类型在它们之间进行某种转换,例如类型转换或其他。

实际上我有两个程序,program1的功能用于 cv::CvCapture ,而program2的功能用于 CvCapture * 。我的意思是这两个程序以不同的方式读取视频文件。

然后,我合并了这两个程序,以使用program1中的某些功能和program2中的某些功能。但是我无法将 cv::CvCapture 转换为 CvCapture *

我在Qt Creator中使用OpenCv。

我的代码很长才能在此处发布,但是我已经简化了代码以使其更小巧易懂。我的代码可能无法正确编译,因为我对其进行了修改以使其更简单。

任何帮助,将不胜感激。提前致谢 :)

void MainWindow::on_pushButton_clicked()
{

 std::string fileName = QFileDialog::getOpenFileName(this,tr("Open Video"), ".",tr("Video Files (*.mp4 *.avi)")).toStdString();

cv::VideoCapture  capture1(fileName);       // when I use the cv::VideoCapture capture it gives  an error

//error: cannot convert 'cv::VideoCapture' to 'CvCapture*' for argument '1' to 'IplImage* cvQueryFrame(CvCapture*)
    //CvCapture* capture2 = cvCaptureFromCAM(-1);
    // but when i use the CvCapture* capture2, it does not recognize capture2.isOpend() and capture2.get(CV_CAP_PROP_FRAME_COUNT) etc. don't work.
    // Is there any way to convert VideoCapture to CvCapture*?
    if (!capture.isOpened())
        {
            QMessageBox msgBox;
            msgBox.exec(); // some messagebox message. not important actually
        }
 cvNamedWindow( name );
 IplImage* Ximage = cvQueryFrame(capture);
 if (!Ximage)
   {
     QMessageBox msgBox;
     msgBox.exec();
    }

 double rate= capture.get(CV_CAP_PROP_FPS);
 int frames=(int)capture.get(CV_CAP_PROP_FRAME_COUNT);
int frameno=(int)capture.get(CV_CAP_PROP_POS_FRAMES);
 bool stop(false);

 capture.read(imgsize);

 cv::Mat out(imgsize.rows,imgsize.cols,CV_8SC1);
 cv::Mat out2(imgsize.rows,imgsize.cols,CV_8SC1);
        //I print the frame numbers and the total frames on  a label.
            ui->label_3->setText(QString::number(frameno/1000)+" / "+QString::number(frames/1000));
            ui->label->setScaledContents(true);
            ui->label->setPixmap(QPixmap::fromImage(img1)); // here I show the frames on a label.
  }

最佳答案

cv::VideoCapture来自OpenCV的 C++接口(interface),可用于从摄像头设备和磁盘上的文件捕获

cv::VideoCapture  capture1(fileName);
if (!capture.isOpened())
{
    // failed, print error message
}
cvCaptureFromCAM()是来自OpenCV的 C接口(interface)的函数,仅用于从摄像机设备捕获:
CvCapture* capture2 = cvCaptureFromCAM(-1);
if (!capture2)
{
    // failed, print error message
}

不要将这些接口(interface)混合/合并在一起,不要随意选择并坚持使用。

如果要使用C接口(interface)从视频文件捕获,请改用cvCaptureFromFile():
CvCapture* capture  = cvCaptureFromFile(fileName);
if (!capture)
{
    // print error, quit application
}

检查以下示例:
  • Camera capture using the C interface
  • Camera capture using the C++ interface
  • 07-24 18:58