我正在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;
}
答案 0 :(得分:1)
我不会立即看到问题所在,但是您可以采取哪些措施来帮助自己(或者更新问题以便更有机会获得帮助):
第一次编译并启用警告:
gcc -Wall -Wextra `pkg-config --cflags opencv` `pkg-config --libs opencv` -o videoHandler videoHandler.c
然后修复你得到的任何警告(或编辑问题,如果你无法弄清楚的话就添加它们。)
第二次在调试器下运行您的程序,看看哪一行触发了段错误。如果仍然无法解决问题,那么添加它,以及相关的变量值(通过添加调试打印或通过检查它们与调试器)也是如此。
第三如果仍未解决,请在您的应用程序上运行valgrind(如果您在Windows上,然后安装Linux VM并在其下运行,我通常使用VirtualBox +最新可用Lubuntu虚拟磁盘映像)。
实际上,你应该尝试valgrind即使你解决了这个问题,看看它给出了什么警告,如果其中任何一个实际上是你应该修复的错误(它也可能会产生误报,甚至很多他们有一些图书馆。)