ページ 11

EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月20日(水) 08:40
by LPluser
カメラから取得した画像をつかってゲームをつくろうとおもい、EWCLIB(http://www.geocities.jp/in_subaru/ewclib/index.html)を使っています。

EWCLIBでとりこんだキャプチャ画像をDXLibで使いたいのですが、
http://www.geocities.jp/in_subaru/ewcli ... p.html#e15
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1837
を参考にして組んでみたのですが、表示されるがぞうはグレーで、正しく表示されません。(ただしカメラでうつしている物がうごくと画像もかわるので一応よみこんではいると思われる)

コード:

#include "DxLib.h"
#include "ewclib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	// ウインドウモードで起動
	ChangeWindowMode( TRUE ) ;
	//EWCLIB初期化(320*240,30fps)
	EWC_Open(0,320,240,30.0);
	//DxLib初期化処理
	if( DxLib_Init() == -1 ) return -1;
	// 描画先を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	//画像変換用
	int buffer[320*240];
	int GrHandle ;
	BASEIMAGE BaseImage ;

	//画像変換用初期化
	// カラーフォーマットは変化しないので最初に設定
	CreateFullColorData( &BaseImage.ColorData ) ;
	// ミップマップではないので0
	BaseImage.MipMapCount = 0 ;
	// 空のグラフィックハンドルの値を初期化
	GrHandle = -1 ;

	// メインループ
	while( ProcessMessage() == 0 ){

		//画像取得
		EWC_GetImage(0,&buffer);

		//画像変換
		// BASEIMAGE の要素を埋める
		BaseImage.GraphData = buffer;
		BaseImage.Width = 320;
		BaseImage.Height = 240;
		BaseImage.Pitch = 320;

		// グラフィックハンドルを作成しているかどうかで処理を分岐
		if( GrHandle == -1 )
		{
			// 最初の場合はグラフィックハンドルの作成と映像の転送を一度に行う
			GrHandle = CreateGraphFromBaseImage( &BaseImage ) ;
		}
		else
		{
			// 2回目以降はグラフィックハンドルへ映像を転送
			ReCreateGraphFromBaseImage( &BaseImage, GrHandle ) ;
		}

		
		//変換した画像画面に描画
		DrawGraph( 0, 0, GrHandle, FALSE );

		ScreenFlip();
	}

	//終了処理
	DxLib_End() ;
	EWC_Close(0);
	return 0 ;
}
あとコレは余談ですがAeroBeatのように色で物体を認識しようとしたらやはりOpenCVでないと難しいのでしょうか・・・OpenCVは画像関連の専門用語だらけでよくわかりません・・・

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月20日(水) 08:51
by LPluser
追記:
環境
VisualC++2008 Express Edition
Intel Core2Duo
使用カメラ:Logicool HD Webcam c525

あとC言語の知識は、中学生のことから3年くらいDxLibをさわって(今高1)多少複雑な2Dゲームをつくっていたレベルです。
(あとWindowsフォームアプリケーションも多少)
他のライブラリのことはあまりわかりません。よろしくおねがいします。

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月20日(水) 09:13
by みけCAT
関数の仕様がよくわかりませんが、
配列そのもののアドレスを渡すために、
EWC_GetImage(0,&buffer);→EWC_GetImage(0,buffer);
としたらどうでしょうか?

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月20日(水) 10:44
by LPluser
EWC_GetImage(0,buffer);
としましたがやはり得られる画像は全体がグレーのよくわからない画像になりました・・・

私が考えたのは、

EWCLIBとOpenCVをつかう例http://www.geocities.jp/in_subaru/ewclib/help/ ... p.html#e15
をみる分には
EWC_SetBuffer(0,imgc->imageData); //カメラ画像格納先の変更
というのがあるのでOpenCVで使われるimageDataのなかにカメラの画像が入っているから、
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1837
のとおりに変換してやればいいのかな?と思ったのですが・・・このやり方が根本的に間違っているのでしょうか?

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月20日(水) 18:36
by ISLe
想像で書いてますが。

BaseImage.Pitch = 320;
じゃなくて
BaseImage.Pitch = BaseImage.Width * BaseImage.ColorData.PixelByte;
だったらどうなります?

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月20日(水) 18:44
by LPluser
>>ISLe様
BaseImage.Pitch = BaseImage.Width * BaseImage.ColorData.PixelByte;
にしてみたところ、今までよりもまともな画像が読み込めました。
ただモノクロというかモノクロの画像に微妙に赤や青色の線が入ってる画像になり、正しい画像が3回連続したようなものになってしまいます・・

・・・・BaseImage.Pitch・・・こういうのが何を指しているのか理解しないと難しいようですね・・・<(_ _)>

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月21日(木) 03:41
by ISLe
さらに
CreateFullColorData( &BaseImage.ColorData ) ;

CreateXRGB8ColorData( &BaseImage.ColorData ) ;
に変えたら上手く行くような気がします。

これでダメなときはCreateColorDataで細かくフォーマットを指定する必要がありますね。

Re: EWCLIBでとりこんだキャプチャ画像をDXLibで使いたい

Posted: 2011年7月21日(木) 07:07
by LPluser
CreateXRGB8ColorData( &BaseImage.ColorData ) ;にしてみたところ無事動きました!!

ありがとうございましたm(。≧Д≦。)m