![](/img/trans.png)
[英]How to check in cmake whether a given header file is available for C++ project
[英]How to check whether a given file is a valid video file in C++?
我尝试使用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?
确定文件是否“有效”的唯一真正好方法是使用具有适当格式的读取器功能来读取其内容。 没有简单的通用标记可以说“这是一个真实的视频文件,不能再有其他东西了”-即使存在,有人可能有意或无意地将其放入了文件中,因此看起来像是“真实视频”,但当您阅读其余信息时不是。 由于存在数十种不同的视频文件格式,因此很难做到比“尝试一下,看看会发生什么”更明智的事情。
如另一个答案中所述, cv::VideoCapture::read()
将读取文件,并在文件无效时返回错误指示。 如果要区分“文件不存在”,则可以在尝试读取文件之前进行一些检查,因此可以说“文件不存在”,而不是“抱歉,但这似乎不是”有效视频文件”-尽管后者也适用于“也没有这样的文件”。
请注意,如果文件存在,我希望cv::VideoCapture
会说isOpened()
,因此对于文本文件或PDF,它将很乐意接受为“打开”。 您实际上必须尝试读取该文件以判断它是否为视频文件。 但是,就“输入错误会发生什么”而言, ::get
和::read
的文档都几乎没有用,似乎这些函数仅设计用于有效输入。
我不熟悉openCV,但您始终可以检查文件扩展名。
kdt为此问题写了一个方法https://stackoverflow.com/a/874160/4612406
bool hasEnding (std::string const &fullString, std::string const &ending)
{
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
只需传递文件名和所需的文件扩展名即可,例如“ .mp4”。 您可以更改此方法以采用向量作为结束字符串,并检查向量中可以放置.mp4 .avi等的每个字符串。
您可以使用VideoCapture::read()
,如果满足以下条件,则将返回false:
例:
cv::VideoCapture cap(input_name);
auto x = cap.read(im);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.