私は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);
}
_
このコードは、ファイルにコーデックYUV 4:2:2 (UYVY)
(Direct-Showを使用してビデオを録画した)がある場合は機能しませんが、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
_でクラッシュします。私は同様の質問を読みましたが、私のビデオにはUYVY(4:2:2)があるのに対し、それらはYUV(4:2:0)のフレームを使用しています。これを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;
}
_
これがあなたを助けるかもしれないいくつかのリンクです:
編集:
最初に何かをクリアする必要があります:OpenCVはビデオファイルからYUVフレームを読み取ることができます。これは、基盤となるライブラリ(FFmpeg/GStreamer)がその役割を果たしているためです。 OpenCVは、特定のタイプの YUVおよびRGB からcvCvtColor()
を_CV_YCrCb2RGB
_または_CV_RGBYCrCb
_で変換することもサポートしています。
もう一度質問を調べたところ、発生したエラーの種類を指定していないことに気付きました。 より良い仕事をする at dealing with possiblefailure キャプチャインターフェイスからメッセージをに出力することでthrow
する代わりに画面。
共有したビデオファイルをテストしましたが、次のコードを使用してウィンドウで問題なく再生できました。
_#include <cv.h>
#include <highgui.h>
#include <iostream>
int main(int argc, char* argv[])
{
cv::VideoCapture cap(argv[1]);
if (!cap.isOpened())
{
std::cout << "!!! Failed to open file: " << argv[1] << std::endl;
return -1;
}
cv::Mat frame;
for(;;)
{
if (!cap.read(frame))
break;
cv::imshow("window", frame);
char key = cvWaitKey(10);
if (key == 27) // ESC
break;
}
return 0;
}
_
何らかの理由でキャプチャインターフェイスがファイルを開くことができない場合、cap.read(frame)
でクラッシュするだけでなく、アプリケーションをすぐに終了します。
ビデオの表示を探しているだけの場合は、これが私のために働いたコードです。それが何らかの形で役立つかどうかを確認してください。
#include <stdio.h>
#include <opencv2/opencv.hpp>
int main(){
CvCapture *camera=cvCaptureFromFile("C:\\test.avi");
if (camera==NULL)
printf("camera is null\n");
else
printf("camera is not null");
cvNamedWindow("img");
while (cvWaitKey(10)!=atoi("q")){
double t1=(double)cvGetTickCount();
IplImage *img=cvQueryFrame(camera);
/*if(img){
cvSaveImage("C:/opencv.jpg",img);
}*/
double t2=(double)cvGetTickCount();
printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
cvShowImage("img",img);
}
cvReleaseCapture(&camera);
}
これがお役に立てば幸いです。