使用OpenCV的C++ API抽取mp4為png時,發(fā)現(xiàn)CV_CAP_PROP_POS_MSEC屬性居然在OpenCV 3.3.0版本下失效蹭越。
一、需求
- 把mp4等時間間隔抽取為png
- 環(huán)境:Mac OS
- 語言:C++
- 抽取間隔:50ms
二棋电、問題描述
在OpenCV 3.2.0下可以按如下方式實現(xiàn)(簡化代碼):
VideoCapture *cap = new VideoCapture("/path/to/video");
Mat lastFrame;
int count = 100;
while (--count >= 0) {
// 等時間間隔抽取圖片
cap->set(CV_CAP_PROP_POS_MSEC, count * 50);
Mat frame;
// 獲取幀
cap->read(frame);
if (frame.empty()) {
break;
}
// 獲得此幀據(jù)mp4開始的時間間隔振劳,單位ms
long timeFromBegin = static_cast<long>(cap->get(CV_CAP_PROP_POS_MSEC));
try {
string outputDir = "/path/to/output";
stringstream ss;
string fileName;
vector<int> compression_params;
compression_params.push_back(16);
compression_params.push_back(9);
ss << outputDir << "/" << timeFromBegin << ".png" << endl;
ss >> fileName;
// 寫入文件
imwrite(fileName, frame, compression_params);
} catch (cv::Exception &ex) {
cout << "Caught error " << ex.what() << endl;
}
}
然而昭伸,某天手一抖
brew update
brew upgrade
發(fā)現(xiàn)OpenCV升級到了3.3.0。澎迎。。
偶然間發(fā)現(xiàn)选调,之前寫的等間隔抽取mp4的代碼的精度出現(xiàn)了嚴重的問題夹供,通過brew switch把OpenCV降級到3.2.0后問題消失。
懷疑在OpenCV 3.3.0上仁堪,cap->set(CV_CAP_PROP_POS_MSEC, count * 50)失效哮洽,不知道為什么,可能是只讀取了關(guān)鍵幀弦聂,而不是下一個50ms吧鸟辅,。
時間有限莺葫,先這么記錄匪凉。