2

私はビデオを撮ってそれを再生する簡単なプログラムを持っています(それはビデオでいくつかの画像処理を行いますが)。ビデオは、ダイアログボックスの結果から取得することも、ファイルのパスを指定して直接取得することもできます。cv :: CvCapturecapture1を使用するとcapture1.isOpen()、capture1.get(CV_CAP_PROP_FRAME_COUNT)などのプロパティを取得しますが、CvCapture*capture2を使用すると奇妙なエラーが発生します。

関数がcapture1に準拠しているため、cv ::CvCapturecapture1を使用したいと思います。または、型キャストなどのように、両方の型を何らかの変換で使用する方法はありますか?

実際、私は2つのプログラムを持っていました。program1の関数はcv :: CvCapture用で、program2の関数はCvCapture*用でした。つまり、2つのプログラムが異なる方法でビデオファイルを読み取るということです。

次に、これら2つのプログラムをマージして、program1の一部の関数とprogram2の一部の関数を使用しました。しかし、cv::CvCaptureCvCapture*に変換することはできません。

QtCreatorで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.
  }
4

1 に答える 1

8

cv::VideoCaptureOpenCVのC++インターフェイスからのものであり、カメラデバイスおよびディスク上のファイルからキャプチャするために使用できます

cv::VideoCapture  capture1(fileName); 
if (!capture.isOpened())
{
    // failed, print error message
}

これは、カメラデバイスからのキャプチャにのみ使用されるOpenCVのCインターフェイスcvCaptureFromCAM()の機能です。

CvCapture* capture2 = cvCaptureFromCAM(-1);
if (!capture2)
{
    // failed, print error message
}

このインターフェースを混ぜたりマージしたりしないでください。1つを選んでそれを使い続けてください。

Cインターフェイスを使用してビデオファイルからキャプチャする場合は、cvCaptureFromFile() 代わりに次を使用します。

CvCapture* capture  = cvCaptureFromFile(fileName);
if (!capture)
{
    // print error, quit application
}

次の例を確認してください。

于 2012-06-06T01:03:28.030 に答える