cvCreateFileCapture странная ошибка
Я пытаюсь создать простую программу Opencv на C, которая создает захват файла из.avi, и он воспроизводит его в окне, выделяющем лица. Я использую скомпилированную версию OpenCV (я уже пробовал то же самое с изображением в формате JPEG, и это работает).
Сборка идет хорошо, без ошибок, без предупреждения, но когда я запускаю его, консоль выводит следующее:
Обнаружен неизвестный параметр: "роль сервера". Игнорируется неизвестный параметр "роль сервера".
И программа просто останавливается
Ранее он жаловался на отсутствующий файл /home/#user/.smb/smb.conf, поэтому я попытался установить samba (хотя я до сих пор не представляю, что во всем этом должна делать samba)
вот мой код:
главный(){
printf("Ciao!");
cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
cvWaitKey(0);
printf("ok");
CvCapture* capture = cvCreateFileCapture("monsters.avi");
CvHaarClassifierCascade* cascade = load_object_detector("haarcascade_frontalface_alt.xml");
CvMemStorage* storage = cvCreateMemStorage(0);
//List of the faces
CvSeq* faces;
while (0<10) {
CvArr* image = cvQueryFrame(capture);
double scale = 1;
faces = cvHaarDetectObjects(image,cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(1,1), cvSize(300,300));
int i;
for(i = 0; i < faces->total; i++ )
{
CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );
cvRectangle( image,
cvPoint(face_rect.x*scale,face_rect.y*scale),
cvPoint((face_rect.x+face_rect.width)*scale,(face_rect.y+face_rect.height)*scale),
CV_RGB(255,0,0) , 3, 8, 0);
}
cvReleaseMemStorage( &storage );
cvShowImage("window", image);
}
cvWaitKey(0);
printf("Ciao!");
}
Я благодарю вас за ваш ответ, я перешел на C++ для моих испытаний. Теперь я сделал это:
int main(){
namedWindow("Video", CV_WINDOW_FREERATIO);
VideoCapture cap("sintel.mp4");
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
for(;;){
Mat frame;
cap>>frame;
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("Video", edges);
//cvWaitKey(0);
}
return(0);
}
Теперь он успешно загружает видео и запрашивает кадр, каждый раз, когда я нажимаю клавишу, он, очевидно, запрашивает другой кадр, и все работает нормально, но если я комментирую waitkey(), программа просто немного зависает и вылетает, если я пытаюсь закрыть окно, я начинаю думать, что есть проблема с кодеками или что-то в этом роде...
2 ответа
Теперь он работает нормально, я изменил cvWaitKey() с этим
if(waitKey(30) >= 0) break;
Я точно не понимаю, почему, но сейчас все работает как надо:)
В коде так много потенциальных проблем, большинство из которых связано с отсутствием защитного кодирования.
Что такое cvWaitKey(0);
делать после cvNamedWindow()
? Это ненужно, удали это!
Что произойдет, если захват был неудачным? Код в обороне:
CvCapture * capture = cvCreateFileCapture ("monsters.avi"); if (! capture) {// Файл не найден, обработать ошибку и, возможно, выйти из приложения}
и вы должны использовать эту технику для каждого указателя, который вы получаете от OpenCV, хорошо?
Одной из основных проблем является то, что вы выделяете память для CvMemStorage
перед циклом, но внутри цикла вы освобождаете его, что означает, что после первой итерации цикла больше не будет действительного CvMemStorage* storage
И это огромная проблема.
Либо переместите процедуру выделения в начало цикла, чтобы на каждой итерации выделялась / освобождалась память, либо перемещайте cvReleaseMemStorage( &storage );
вызов из цикла.