2013-04-04 4 views
2

Я отладки эту небольшую программу в Linux компиляции кода с:Получение OpenCV на работу (выдаёт ошибку сегментации)

gcc `pkg-config --cflags opencv` `pkg-config --libs opencv` -o videoHandler videoHandler.c 

И когда я запускаю его я получаю этот выход:

minscanline 1 
minscanline 1 
minscanline 1 
minscanline 1 
Video loaded succesfully 
minscanline 1 
Segmentation fault 

Все Я действительно заботитесь о том, что while loop, потому что мне нужно получить отдельные кадры файла фильма. Есть идеи?

#include <cv.h> 
#include <highgui.h> 
#include <stdio.h> 

#define HEIGHT 480 
#define WIDTH 640 

// Position the video at a specific frame number position 
//cvSetCaptureProperty(video, CV_CAP_PROP_POS_FRAMES, next_frame); 

// Convert the frame to a smaller size (WIDTH x HEIGHT) 
//cvResize(img, thumb, CV_INTER_AREA); 

int main(void){ 

    CvCapture *video; 
    IplImage *image; 
    CvMat *thumb; 
    CvMat *encoded; 

    // Open the video file. 
    video = cvCaptureFromFile("sample.avi"); 
    if (!video) { 
     // The file doesn't exist or can't be captured as a video file. 
     printf("Video could not load\n"); 
    }else{ 
     printf("Video loaded succesfully\n"); 
     // Obtain the next frame from the video file 
     while (image = cvQueryFrame(video)) { 
      printf("Inside loop\n"); 
      //If next frame doesn't exist, Video ended 

      thumb = cvCreateMat(HEIGHT, WIDTH, CV_8UC3); 

      // Encode the frame in JPEG format with JPEG quality 30%. 
      const static int encodeParams[] = { CV_IMWRITE_JPEG_QUALITY, 30 }; 
      encoded = cvEncodeImage(".jpeg", thumb, encodeParams); 
      // After the call above, the encoded data is in encoded->data.ptr 
      // and has a length of encoded->cols bytes. 

      namedWindow("Display Image", CV_WINDOW_AUTOSIZE); 
      imshow("Display Image", encoded); 

      printf("Frame retrieved, length: %s\n", encoded->cols); 
     } 


     // Close the video file 
     cvReleaseCapture(&video); 
    } 


    return 0; 
} 

ответ

1

Я не сразу увидеть, в чем проблема, но вот то, что вы можете сделать, чтобы помочь себе (или обновить вопрос, чтобы иметь больше шансов получить помощь здесь):

1- компиляции с предупреждениями включено:

gcc -Wall -Wextra `pkg-config --cflags opencv` `pkg-config --libs opencv` -o videoHandler videoHandler.c 

Тогда исправить все предупреждения, вы получите (или отредактировать вопрос, чтобы добавить их, если вы не можете понять их).

Запустите программу под отладчиком и посмотрите, какая строка запускает segfault. Добавьте это, а также соответствующие значения переменных (либо добавив отладочные отпечатки, либо исследуя их с помощью отладчика), чтобы задать вопрос, если вы все еще не можете понять это.

третьего, если до сих пор не решена, запустите valgrind на приложения (если вы на Windows, а затем установить Linux VM и запустить его под ней, я обычно использую VirtualBox + последний доступный образ Lubuntu виртуального диска).

На самом деле, вы должны попробовать valgrind, даже если вы решите эту проблему и узнаете, какие предупреждения она дает, и если какие-либо из них на самом деле являются ошибками, которые вы должны исправить (это может также дать ложные срабатывания, даже многие из них с некоторыми ЛИЭС).

+0

Спасибо, человек, я это учту. ОБНОВЛЕНИЕ: частично работает. –

+0

@ PatricioJerí Еще одна вещь, которую нужно проверить: проверить, что видео воспроизводится с приложением видеопроигрывателя, а также проверить приложение с другим видео, желательно с другим кодированием. Не исключено, что есть ошибка, вызванная недействительным видеофайлом или даже действительным, но плохо протестированным видеокодеком в действительном файле, что вызывает это Segfault. – hyde

+0

Последнее значение printf() с% s для представления целого числа неверно. Вот почему вы получаете segfault. Измените% s на% d. С уважением –

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