Чтобы сделать мой вопрос более ясным, просмотрите следующие коды ниже:
Для привязки изображения:
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.
Когда я комментирую/удаляю строку, я могу правильно отображать изображение, щелкая по другой кнопке, но когда я хочу щелкнуть новые изображения, я должен нажать кнопку несколько раз, что является серьезным недостатком в программе. Стоит ли вообще обойти это?
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);
}
Заменить:
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 за один вызов. Возвращенное изображение не должно быть выпущено или изменено пользователем.