2

我在 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;
}
4

1 回答 1

1

我没有立即看出问题所在,但您可以采取以下措施来帮助自己(或更新问题以便有更好的机会在这里获得帮助):

第一次编译启用警告:

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

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

第二次在调试器下运行你的程序,看看哪一行触发了段错误。如果您仍然无法弄清楚,请将其以及相关的变量值(通过添加调试打印或使用调试器检查它们)添加到问题中。

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

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

于 2013-04-04T19:30:41.307 回答