Ошибка cvReleaseCapture ()

0

Чтобы сделать мой вопрос более ясным, просмотрите следующие коды ниже:

Для привязки изображения:

void CameraTest ::on_snapButton_clicked()
{
    CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0


    cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_WIDTH , 800); 
    cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_HEIGHT , 600); 


    if(!cvGrabFrame(capture))  //if no webcam detected or failed to capture anything
    {              // capture a frame 
        cout << "Could not grab a frame\n\7";
        exit(0);
    }

    IplImage* img=cvRetrieveFrame(capture);           // retrieve the captured frame

    cv::Mat imageContainer(img);
    image=imageContainer;
    cv::imshow("Mat",image);  

    //cvReleaseCapture(&capture);  When I enable this, and run the programming calling this, there will be an error. 
}

Теперь программа для отображения изображения:

      void CameraTest ::on_processButton_clicked() 
      {
          cv::imshow("image snapped", image);

          //my image processing steps...
      }

Когда я cvReleaseCapture(&capture), я получаю следующую ошибку:

Unhandled exception at 0x00fc3ff5 in CameraTest.exe: 0xC0000005: Access violation reading location 0x042e1030.

Когда я комментирую/удаляю строку, я могу правильно отображать изображение, щелкая по другой кнопке, но когда я хочу щелкнуть новые изображения, я должен нажать кнопку несколько раз, что является серьезным недостатком в программе. Стоит ли вообще обойти это?

Теги:
opencv
image-processing
computer-vision

2 ответа

2
Лучший ответ
  • избегайте устаревших функций c-api (IplImages, Cv *) с помощью c++ api.
  • изображения, которые вы получаете из точки захвата в память внутри камеры. если вы не клонируете() изображение и не отпустите захват, вы получите свисающий указатель.
  • не создавайте новый захват для каждого снимка. (кулачок нуждается в некотором "разминке", поэтому он будет медленным, как ад). держите один экземпляр вокруг своего класса вместо этого

class CameraTest 
{
    VideoCapture capture;         // make it a class - member
    CameraTest () : capture(0)    // capture from video device #0
    {
         capture.set(CV_CAP_PROP_FRAME_WIDTH , 800); 
         capture.set(CV_CAP_PROP_FRAME_HEIGHT , 600); 
    }

    // ...
};

void CameraTest ::on_snapButton_clicked()
{
    Mat img;                // temp var pointing todriver mem    

    if(!capture.read(img))  //if no webcam detected or failed to capture anything
    {
        cout << "Could not grab a frame\n\7";
        exit(0);
    }

    image = img.clone();      // keep our member var alive
    cv::imshow("Mat",image);  

}
  • 0
    Спасибо @Berak! Это сработало, плюс один и принял ответ за вас. Ценить это(:
1

Заменить:

if(!cvGrabFrame(capture))  //if no webcam detected or failed to capture anything
    {              // capture a frame 
        cout << "Could not grab a frame\n\7";
        exit(0);
    }

от

if ( !capture )
        {
            cout << "Could not grab a frame\n\7";
            exit(0);

        }

и заменить

  IplImage* img=cvRetrieveFrame(capture);

от

IplImage* img = cvQueryFrame( capture );

cvQueryFrame Захватывает и возвращает кадр из видео или камеры. Эта функция представляет собой combination cvGrabFrame и cvRetrieveFrame за один вызов. Возвращенное изображение не должно быть выпущено или изменено пользователем.

  • 0
    Не работает, но +1 за предложение. Ценить это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню