解决 CAP_IMAGES: can't find starting number (in the name of file)
1. 解决方法
网上搜了一下,有人说opencv编译时少编了ffmpg的库,要下载这个库并重新编译。但是我嫌太麻烦所以没这么弄。
先放上我的解决方案:将输出文件类型改为.mp4。
以下详细解释这样修改的原因。
2.报错代码
#define VIDEO_OUTPUT_PATH "D:\\test_project\\output.avi"
int main()
{
Mat frame;
frame = imread("xxx.jpg");
VideoWriter vWriter(VIDEO_OUTPUT_PATH, CAP_OPENCV_MJPEG, 30, Size(frame.cols, frame.rows));
int frameNum = 90;
while (frameNum) {
vWriter << dst;
frameNum--;
}
return 0;
}
3.报错Log
[ERROR:0] global C:\build\master_winpack-build-win64-vc14\opencv\modules\videoio\src\cap.cpp (563) cv::VideoWriter::open VIDEOIO(CV_IMAGES): raised OpenCV exception:
OpenCV(4.5.1) C:\build\master_winpack-build-win64-vc14\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): D:\\test_project\\output.avi in function 'cv::icvExtractPattern'
4.错误分析
上面两句是运行时的报错信息。 第一句就是VideoWriter::open运行时收到异常。 第二句是具体的异常内容:
OpenCV(4.5.1) C:\build\master_winpack-build-win64-vc14\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can’t find starting number (in the name of file): D:\test_project\output.avi in function ‘cv::icvExtractPattern’ 我们可以从报错log中得出以下信息:
- 错误log由文件cap_images.cpp 第253行打印
- 貌似是文件名有点问题
- 具体是cv::icvExtractPattern函数中打印的
那么接下来就看下opencv源码,查一查我的文件名到底有什么问题
5.opencv源码分析
std::string icvExtractPattern(const std::string& filename, unsigned *offset)
{
size_t len = filename.size();
。。。。。。
pos = filename.rfind('/');
#ifdef _WIN32
if (pos == std::string::npos)
pos = filename.rfind('\\');
#endif
if (pos != std::string::npos)
pos++;
else
pos = 0;
while (pos < len && !isdigit(filename[pos])) pos++;
if (pos == len)
{
CV_Error_(Error::StsBadArg, ("CAP_IMAGES: can't find starting number (in the name of file): %s", filename.c_str()));
}
。。。。。。
}
以上代码实现的应该是从输出文件名找到需要输出的文件类型。 因为关键点 while (pos < len && !isdigit(filename[pos])) pos++; 这里实现的是如果文件名中 pos所指的字符不是数子,那么pos就++,指向下一个字符。看起来因该就是想要找到带数组的某种文件名。 因此灵机一动,将输出文件的文件类型设置为mp4,然后问题就解决了。
#define VIDEO_OUTPUT_PATH “D:\test_project\output.avi” 改为: #define VIDEO_OUTPUT_PATH “D:\test_project\output.mp4”
如有帮助,不妨点赞关注以支持。
|