MenuBar

OpenCV3.10を使用。
VC2015
C++環境

必要なもの

64bit環境用のLibファイルしかないので64bit版でコンパイルが必要。
x86でもコンパイルは通るが、リンク時にエラーが出る。

■ダウンロード
 opencv-3.1.0.exeをダウンロードして展開。その中から必要なファイルを抜き出す。

■includeファイルをコピーしてパスの通ったところに置く。
 ルートは「dir」のところにする。

+dir
  +-opencv
   opencv2

■ライブラリのパスが通ったところにおいておく
・opencv_world310.lib
※これとリンクすればDLLはいらないと思っていたけどDLLは別途必要だった

■実行ファイルと同じ階層においておく
・opencv_ffmpeg310_64.dll
・opencv_world310.dll

簡単なコード

ココを参考にメインループに組み込んでみる
http://nonbiri-tereka.hatenablog.com/entry/2014/04/15/094559

・付属の「box.mp4」を読んで見る。
 自分で作ったメインウインドウとは別にウインドウが開いて正しく再生された

・自分で用意した「test.mv4」を読んで見る。
 こちらも正しく動画再生された

独自にWindowを生成して表示することができるあたりOpenGLと似たような考え方なのかもしれない。データから現在のフレーム情報を取得して画面幅分のRGB値を取得することができるだろうか?

自分のメインウインドウに表示するにはどうすればいいか。

最短距離でコレができることを調査してみる。

・現在のフレームデータをARGBで取得する関数を作れるか?
 Uint32* GetFrameData(int frmIndex);
・ReadTextureしてVRAMバッファにコピーする
・UploadTextureしてVRAMバッファを更新(毎フレーム)
・PutSpriteして画面に表示する

現在のフレームデータをARGBで取得する関数を作れるか?

int OpenCVTest()
{
	static int frm = 0;

	static cv::VideoCapture video;

	if( frm == 0 )
	{
		//m4vファイル読み込み
		video.open("030_dokkin(256x170).m4v");
	}

	if( !video.isOpened() ) return 0;

	if( video.grab())	//grabするごとにフレームが更新される
	{
		Mat frame;
		Mat edges;

		video.retrieve(frame, 0);

		//画像のサイズを得る
		Sint32 w, h;

		w = frame.cols;
		h = frame.rows;

		//送られてきた画像をOpenGLのRGBAに変換する
		cvtColor(frame, edges, CV_RGB2BGRA);

		Uint8 *pData;
		pData = edges.data;

		//メモリ内にTGA画像を作ってテクスチャを読みこませる

		CFileTarga tga;

		tga.Create(w, h, 24);

		//w x hのARGB画像をテクスチャに打ち込む

		Sint32 n = 0;

		for (Sint32 y = 0; y < h; y++)
		{
			for (Sint32 x = 0; x < w; x++)
			{
				tga.setARGB(x, y, ARGB(0xff, pData[n * 4 + 0], pData[n * 4 + 1], pData[n * 4 + 2]));
				n++;
			}
		}

		//出来あがったテクスチャを読み込む

		dqLib::ReadTexture(16, tga.getImage(), tga.getFileSize(), 0xff00ff00);
		dqLib::UploadTexture();

		//で、表示する

		dqLib::PutSprite(0, 0, 200, 16, 0, 0, 256, 256, 0, 0);

		//ファイルに吐く場合にこっち

		//tga.SaveFile("test.tga");
	}

	frm ++;

	return 0;
}