openCVで読み込んで表示したいビデオengine2.aviがあります。これが私のコードです:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
string filename = "D:\\BMDvideos\\engine2.avi";
VideoCapture capture(filename);
Mat frame;
if( !capture.isOpened() )
throw "Error when reading steam_avi";
namedWindow("w", 1);
for( ; ; )
{
capture >> frame;
//if(!frame)
// break;
imshow("w", frame);
waitKey(20); // waits to display frame
}
waitKey(0);
}
ファイルにコーデックが含まれている場合 (Direct-Show を使用してビデオを録画した場合)、このコードは機能しませんが、YUV 4:2:2 (UYVY)
openCV で取得したビデオを使用すると機能します !!
これがどのように機能するか考えている人はいますか?
アップデート:
例外をキャッチすると問題が解決することを示唆するいくつかのリンクを読んだ後、コードを変更しました。役に立ちませんでしたが、変更されたコードは次のとおりです。
cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;
try
{
cap >> frame;
}
catch(cv::Exception ex)
{
std::cout << ex.what() << std::endl;
}
catch(...)
{
std::cout << "Unknown exception" << std::endl;
}
でプログラムがクラッシュしcap>>frame
ます。同様の質問を読みましたが、YUV (4:2:0) のフレームを使用していますが、私のビデオには UYVY (4:2:2) があります。これをRGBカラーモデルに変換するにはどうすればよいですか?
更新 2:
karlphillip の提案の後、OpenCV2.4.3 を使用しましたが、以下のコードを使用しても同じエラーが発生しました。
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main(){
cv::Mat frame;
cv::VideoCapture cap("d:\\BMDvideos\\B\\Aufnahme.avi");
if(!cap.isOpened())
{
cout << "Error can't find the file"<<endl;
}
while(1){
if(!cap.read(frame))
imshow("",frame);
cv::waitKey(33);
}
return 0;
}