2012-06-06 3 views
2

У меня есть простая программа, которая снимает видео и воспроизводит его (хотя и делает некоторую обработку изображения на видео). Видео можно получить из результата диалогового окна или напрямую, указав путь к файлу. Когда я использую резюме :: CvCapture Capture1, я получаю такие свойства, как capture1.isOpen(), capture1.get (CV_CAP_PROP_FRAME_COUNT) и т.д., но когда я использую CvCapture * capture2 я получаю странные ошибки.не может преобразовать 'cv :: VideoCapture' в 'CvCapture *'

Я хочу использовать резюме :: CvCapture Capture1 из-за своих функций в соответствии с Capture1. Или есть ли способ использовать оба типа с каким-то преобразованием между ними, например, тип casting или что-то еще.

На самом деле у меня было две программы, то функции program1 были для сорта :: CvCapture и функции program2 были для CvCapture *. Я имею в виду, что две программы читают видеофайл разными способами.

Затем я объединил эти две программы, чтобы использовать некоторые функции из программы 1 и некоторые функции из программы2. Но я не могу преобразовать cv :: CvCapture в CvCapture *.

Я использую OpenCv с Qt Creator.

Мой код очень длинный, чтобы публиковать здесь, но я упростил свой код, чтобы сделать его более компактным и понятным. Мой код не может правильно компилироваться, потому что я его модифицировал, чтобы упростить его.

Любая помощь будет оценена по достоинству. Заранее спасибо :)

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. 
    } 

ответ

7

cv::VideoCapture от интерфейса C++ из OpenCV, и может быть использован для захвата с камеры устройства и из файла на диске

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

и cvCaptureFromCAM() является функция от интерфейса C из OpenCV, который используется только для захвата с камеры устройства:

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

Не смешивайте и не объединяйте эти интерфейсы вместе, выберите один и придерживайтесь его.

Если вы хотите использовать интерфейс C для захвата из видео файла, используйте cvCaptureFromFile() вместо:

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

Проверьте эти примеры:

+1

** karlphillip ** большое спасибо за ваш ответ, теперь, если я выберите любой из них, тогда мне придется изменить мои функции в соответствии с этим, потому что функции, связанные с ** cvCapture ***, не работают с ** cv :: videoCapture **, я думаю, что для них есть эквивалентные функции выполняя ту же задачу. Я должен искать их. в любом случае, спасибо большое –

Смежные вопросы