让opencv工作(segfault)

时间:2013-04-04 17:18:10

标签: c opencv

我正在Linux中调试这个小程序,用以下代码编译代码:

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循环,因为我需要获取电影文件的各个帧。有什么想法吗?

#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 个答案:

答案 0 :(得分:1)

我不会立即看到问题所在,但是您可以采取哪些措施来帮助自己(或者更新问题以便更有机会获得帮助):

第一次编译并启用警告:

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

然后修复你得到的任何警告(或编辑问题,如果你无法弄清楚的话就添加它们。)

第二次在调试器下运行您的程序,看看哪一行触发了段错误。如果仍然无法解决问题,那么添加它,以及相关的变量值(通过添加调试打印或通过检查它们与调试器)也是如此。

第三如果仍未解决,请在您的应用程序上运行valgrind(如果您在Windows上,然后安装Linux VM并在其下运行,我通常使用VirtualBox +最新可用Lubuntu虚拟磁盘映像)。

实际上,你应该尝试valgrind即使你解决了这个问题,看看它给出了什么警告,如果其中任何一个实际上是你应该修复的错误(它也可能会产生误报,甚至很多他们有一些图书馆。)