OpenCV VideoCapture在大尺寸视频上崩溃
OpenCV VideoCapture Crashes on Large Video Size
我正在尝试读取大小为2448x2050的原始avi视频。每次我试图读取一个帧时,程序都会因seg错误而崩溃。同样的程序适用于较小尺寸的视频。
以下是一个示例程序:
#include <iostream>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
cv::VideoCapture cap(argv[1]);
if(!cap.isOpened())
return -1;
cv::Mat frames;
cv::namedWindow("Window", CV_WINDOW_NORMAL);
for(;;)
{
// error here
cap >> frames;
// ........
cv::imshow("Window", frames);
cv::waitKey(33);
}
return 0;
}
以下是valgrind的输出:
==30166== Invalid read of size 1
==30166== at 0x9ECD550: sws_convertPalette8ToPacked24 (in /usr/lib/x86_64-linux-gnu/libswscale.so.2.1.1)
==30166== by 0x9ED13AA: ??? (in /usr/lib/x86_64-linux-gnu/libswscale.so.2.1.1)
==30166== by 0x9ED385A: sws_scale (in /usr/lib/x86_64-linux-gnu/libswscale.so.2.1.1)
==30166== by 0x4E5066D: CvCapture_FFMPEG::retrieveFrame(int, unsigned char**, int*, int*, int*, int*) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E5071A: cvRetrieveFrame_FFMPEG (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4FB88: CvCapture_FFMPEG_proxy::retrieveFrame(int) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E4BA: cv::VideoCapture::retrieve(cv::Mat&, int) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E2A6: cv::VideoCapture::read(cv::Mat&) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E209: cv::VideoCapture::operator>>(cv::Mat&) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x401330: main (in /home/rumman/temp/Video)
==30166== Address 0x18897a10 is 5,015,952 bytes inside a block of size 5,018,408 free'd
==30166== at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30166== by 0x8CD0113: av_destruct_packet (in /usr/lib/x86_64-linux-gnu/libavcodec.so.54.35.0)
==30166== by 0x8CD04B3: av_free_packet (in /usr/lib/x86_64-linux-gnu/libavcodec.so.54.35.0)
==30166== by 0x4E50BB8: CvCapture_FFMPEG::grabFrame() (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E50C38: cvGrabFrame_FFMPEG (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4F934: CvCapture_FFMPEG_proxy::grabFrame() (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E450: cvGrabFrame (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E46C: cv::VideoCapture::grab() (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E241: cv::VideoCapture::read(cv::Mat&) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x4E4E209: cv::VideoCapture::operator>>(cv::Mat&) (in /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8)
==30166== by 0x401330: main (in /home/rumman/temp/Video)
发现问题只发生在使用原始视频时,与视频分辨率无关。
修补程序可以在这里找到。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在c++中录制具有精确帧时间戳的视频
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 媒体基础 多个视频播放导致内存泄漏和崩溃
- 我的视频流程在运行darknet.exe以进行检测对象时崩溃了
- Mlt框架:在播放视频时崩溃
- While循环在计算着色器是崩溃我的视频卡驱动程序
- OpenCV VideoCapture在大尺寸视频上崩溃
- 崩溃,在控制台应用程序上,试图绘制敌人,越界(遵循视频教程)