从文件中读取视频时opencv的分段错误
Posted
技术标签:
【中文标题】从文件中读取视频时opencv的分段错误【英文标题】:Segmentation Fault with opencv on reading a video from a file 【发布时间】:2013-10-22 10:25:30 【问题描述】:我正在运行一个简单的代码来从文件中捕获视频,但它返回分段错误
#include "opencv2/highgui/highgui.hpp"
#include<opencv2/opencv.hpp>
#include <stdio.h>
//#include <iostream>
using namespace cv;
using namespace std;
int main()
CvCapture* capture = cvCreateFileCapture("/home/ayush/20130521053652.avi");
IplImage* frame = NULL;
if(!capture)
printf("Video Not Opened\n");
return -1;
int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int frame_count = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("Video Size = %d x %d\n",width,height);
printf("FPS = %f\nTotal Frames = %d\n",fps,frame_count);
while(1)
frame = cvQueryFrame(capture);
if(!frame)
printf("Capture Finished\n");
break;
cvShowImage("video",frame);
cvWaitKey(10);
cvReleaseCapture(&capture);
return 0;
我也试过上面的代码,它实际上是一个特定问题的解决方案,但它仍然给了我同样的东西......
视频文件信息
$file 20130521053652.avi
20130521053652.avi: RIFF (little-endian) data, AVI, 640 x 480, 30.00 fps, video:
更多信息
Dimensions: 640 x 480
Codec: 24-bit RGB
Framerate: 30 frames per second
Bitrate: N/A
我认为编解码器一定有问题,我的平台是 linux/ubuntu 12.04 LTS 请任何人建议我解决这个问题
通过 gdb 调试器在frame = cvQueryFrame(capture)
处给出分段错误
o/p 是这样的
(gdb)
66 frame = cvQueryFrame(capture);
(gdb)
Program received signal SIGSEGV, Segmentation fault.
__memcpy_ssse3 () at ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S:160
160 ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S: No such file or directory.
通过 Qt IDE ==> 调试
0xb751d9fa <+0x146a> movzbl (%eax),%eax
1951 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
0xb751d9fd <+0x146d> mov %al,(%edx)
1952 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
1953 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
0xb751d9ff <+0x146f> mov 0x8(%esp),%eax
1954 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
1955 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
1956 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
1957 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
1958 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
1959 in ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S
0xb751da03 <+0x1473> pop %ebx
0xb751da04 <+0x1474
【问题讨论】:
在调试器中运行。它会在崩溃发生时停止,然后让您检查调用堆栈并打印变量值。 通过 gdb 错误是由于frame = cvQueryFrame(capture);
这是视频codec
.......的任何问题吗?
我在这里遇到了同样的问题,但是使用了 VideoCapture 的 OpenCV read() 函数!但是,我只有在处理 640x480 分辨率的视频时才会遇到问题。分辨率较低就不会出现这个问题...
【参考方案1】:
我在 OpenCV 2.4 中遇到了同样的问题,使用 cvCaptureFromFile()/cvQueryFrame()。将我的 AVI 转换为 FLV(使用 avconv)对我有用。
我的猜测是这是一个 OpenCV 错误。
【讨论】:
哦,它真的有帮助吗?也许我会尝试将我的视频转换为 FLV,希望它们能正常工作!以上是关于从文件中读取视频时opencv的分段错误的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频