[英]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.