我尝试使用OpenCV:
std::string input_name = "<path to file>";
cv::VideoCapture cap(input_name);
if(!cap.isOpened()) printf("Invalid video\n");
但是,当我尝试传递.txt文件时,VideoCapture会因未知原因成功读取它。当我试图找到视频中的帧数时,
if(cap.get(cv::CV_CAP_PROP_FRAME_COUNT) == 0) printf("Invalid video\n");
每次执行时都会得到不同数量的帧。我也尝试在文件中找到一个框架的宽度和高度,
cv::Mat Frame;
if(!cap.read(Frame)) printf("Cannot read frame\n");
else
{
printf("Frame width is %d\n", Frame.cols);
printf("Frame height is %d\n", Frame.rows);
}
它们的值分别为640和400。为什么会这样?有没有办法检查给定文件是否是优选使用OpenCV的有效视频文件?
答案 0 :(得分:2)
确定文件是否“有效”的唯一非常好的方法是使用适当的读取器功能读取其内容,该功能可以理解该格式。没有简单的通用标记可以说“这是一个真正的视频文件,并且不能成为别的东西” - 即使有,也有人可能故意或错误地将其放入文件中,使其看起来像“真实视频”,但不是在您阅读其余信息时。由于存在数十种不同的视频文件格式,因此很难做出比“尝试它,看看会发生什么”更为明智的事情。
如另一个答案中所讨论的,cv::VideoCapture::read()
将读取文件并在文件无效时返回错误指示。如果你想区分“文件不存在”,你可以在尝试阅读它之前做一些检查,所以你可以说“文件不存在”,而不是“对不起,但看起来这不是一个有效的视频文件“ - 虽然后者确实适用于”也没有这样的文件“。
请注意,如果文件存在,我希望cv::VideoCapture
说isOpened()
,因此对于文本文件或PDF,它会很乐意接受“打开”。您必须实际尝试读取文件以判断它是否是视频文件。但是,::get
和::read
的文档在“输入错误时会发生什么”方面毫无用处,似乎这些函数只能用于有效输入。
答案 1 :(得分:0)
我不熟悉openCV,但您可以随时检查文件扩展名。
kdt在这个问题上为此写了一个方法 https://stackoverflow.com/a/874160/4612406
type.value
只需传递您想要的文件名和文件扩展名&#34; .mp4&#34;。您可以更改此方法以获取结束字符串的向量,并检查向量中的每个字符串,您可以放置.mp4 .avi等。
答案 2 :(得分:0)
您可以使用方法VideoCapture::read()
,如果符合以下情况,则会返回false:
示例:
cv::VideoCapture cap(input_name);
auto x = cap.read(im);