• ベストアンサー

【OpenCV】IplimageをDirectXのテクスチャとして利用する方法

Webカメラにてキャプチャした動画像を,二値化,アフィン変換等の処理を施し,このイメージをテクスチャとしてポリゴン等に貼り付けてリアルタイム表示するといったことを考えています. キャプチャから画像処理まではOpenCVを利用すると簡単そうなのですが,OpenCVで採用されている画像の構造体IplimageをどのようにしたらDirect3D用のテクスチャにできるのかわからず,困っております. そもそもそのようなことができるのかも良くわかりません. どなたか,よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.1

えーーっとぶっちゃけ私 OpenCV なんて分かりません。すいません。 IplImage 自体は OpenCV 独自の実データ構造体なのですよね?ならば、後はその画像データを DirectXのテクスチャフォーマットに自力で変換して、テクスチャのデータを自力で書き換えれば いけるはずです。 つまり現在の貴方は OpenCV の実データを取ることが出来る。 後必要なのは DirectX のテクスチャをロックして自在に書き換える方法(コレは探せばいくらでも出てくるハズです)と OpenCV の画像データと テクスチャの画像データのフォーマットの違いをきちんと見ておくこと パッと見 _IplImage は 32BitRGB 配列が大丈夫っぽいので同じく32BitRGB フォーマットのテクスチャ なら、そう苦労なく落とし込めるはずです。コレを足がかりに出来れば後は個々のフォーマット同士を うまくあわせいくだけかと・・・・まあ速度の問題も出てくるかも知れませんが・・・ こんな感じでいかがでしょうか???

accyon__accyon
質問者

お礼

お返事ありがとうございます! 実はDirectXのプログラミング経験が浅いので,テクスチャの書き換えに関しては少々不安も残りますが,何とかできそうな気がします.ありがとうございました!!

関連するQ&A

  • 画像ボードのバッファにある画像をOpenCVで処理する方法を教えてください

    カメラの画像をグラフインというメーカーの画像ボードを介してPCに取り込んでいます。 ここでその画像をOpenCVを使用して処理しようとしています。 一度保存した画像を処理するのはできるのですが、 画像ボードのバッファからデータを読み込んできてきて処理する方法が分からず困ってます。 Iplimageという構造体にデータを入れればよさそうなのですが、 その変換のやり方がわかりません。 開発環境はWindowsXP visual C++ 2005 MFC です。 当方、プログラムを始めたばかりなので できれば詳しく教えて頂けると助かります。 よろしくお願いいたします。

  • openCVについて‥

    openCVでIplImage構造体の変数に格納された画像の座標値(i,j)の画素RBG値を取れだす方法を知れたいのですが、ご存知の方、是非ご教授ください。

  • opencv1.0 画面が真っ黒

    以前までXPを使用しVisual C++ 2008にopencv1.0を導入し、USB接続のwebカメラから 画像をキャプチャしリアルタイムでの画像処理などのプログラミングしていたのですが、 このたびOSをXP(32bit) からwindows7(64bit)に変え、前使っていた環境つまり Visual C++ 2008 opencv1.0 で設定したところ、コンパイルは正常にでき、普通にpng画像などを取り込むような画像処理は可能なのですが、webカメラからの画像が読み込めず、真っ黒な画像が表示されてしまいました。 ちなみに実行したプログラムはXPの時には正常に作動していたものと同じものを実行しています。 また、webカメラ自体はamcapなどのソフトを使い動作させることはできます。 自分なりに考えた問題点は、 プログラムに問題がある、またはvisualC++を2010にする、opencvを2.2などの最新版に 更新するなどがあげられますが、 この場合なにが原因として考えられるのでしょうか? その点アドバイスいただけたらうれしく思います。 よろしくお願いします。 実行したプログラムは以下の通りです(取り込んだ画像を表示しているだけの、シンプルなプログラムです。直すところなどありましたら教えてください。) *************************************************** #include <cv.h> #include <highgui.h> #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") int main(int argc, char** argv){ int key; CvCapture* capture; capture=cvCreateCameraCapture(-1); IplImage *frameImg =cvQueryFrame(capture); cvNamedWindow("Capture" ,CV_WINDOW_AUTOSIZE); while(1){ cvShowImage("Capture",frameImg); key = cvWaitKey(1); if(key=='q') break; } cvReleaseCapture(&capture); cvDestroyWindow("Capture"); return 0; } ****************************************************

  • OpenCV webカメラ同時出力について

    opencvで画像処理をしています。 Webカメラを2台同時に出力させるプログラムをつくりたいと思っているのですが、方法が全く分かりません。 どうすれば2台同時に出力させることができますか? 1台だけ出力させるプログラムはこちらを使っています。 #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • OpenCVのIplImage型に関する質問

    OpenCVのIplImageという構造体は http://hp.vector.co.jp/authors/VA025246/opencv/004.html のようになっているようなのですが, 画像をキャプチャした際に、「画素のdepthが 8(bit)でチャンネル数3(RGB)のとき」、 char *imageData から、一直線の配列として画像がRGBRGBRGB・・・という風に並んでいて、それぞれの大きさがcharだというのはわかりました。 そこで、imageDataのポインタを進めていって(+1したり+2したりすることで)画像データを読み込んでいます しかし、「depthが32(bit)でチャンネル数1(グレイ画像)のとき」、同じように辿っても、正しいデータが得られませんでした(0.00000という画素値やありえないぐらい大きい値)。 型がcharなので、そこがおかしいのかと思いますが、 char型から始まる画像データなのに、double型(32bit)をどうやっていれてあるのか見当もつきませんし、どうやって32bitずつポインタを進めていくのかもわかりません。 そもそも、ここに本当にデータが入ってるのか・・・(汗 OpenCV経験者の方は少数だと思いますが、画像処理経験者の方など、何か思いつくところがある方、ぜひとも意見をお願いしますm(_ _"m)ペコリ

  • OPENCVの画像処理について

    現在OPENCVを使って画像処理の勉強をしているのですが画像を読み込む際 IplImage* cvLoadImage という関数?を使って画像を読み込んでいるのですが 例えばファイルAに10枚画像が入っていたとしてその10枚をIplImage* cvLoadImageで一枚ずつ読み込むのではなくまとめて読みこむ(配列のように読みこんだ画像の順から[1]などの番号が付くような)という関数はないのでしょうか? 画像を変えるたびに「名前.jpg」を変えないといけない手間を省きたいです。

  • OpenCV処理画像をpictureBoxへ。

    VC++にて画像処理を行っています。 OpenCVのライブラリを使って画像処理をしようと考えているのですが、 処理した画像がMFCで作成したpitureBoxに表示の仕方が分かりません。 調べていくうちに、 「IplImage形式の画像を直接ウィンドウに描画することは出来ないので、 画像をDIBセクション形式に変換してWindows固有の描画処理を行うといい。」 ということが分かり、DIBセクション形式への変換には、IPLを入手し、 「iplConvertToDIB()関数」を使うということが分かりました。 このiplConvertToDIB()関数をつかって画像表示の方法を教えてはいただけないでしょうか?サンプルのソースなどありましたらよろしくお願いいたします。

  • OpenCVでの画像処理について

    OpenCVを用いて連続して画像処理を行おうとしています。 単にcvLoadImageを用いて画像処理を行うことはできるのですが、 if(k=1)IplImage *img = cvLoadImage( "gazou1.jpg", -1); if(k=2)IplImage *img = cvLoadImage( "gazou2.jpg", -1); とif文を用いて画像を取り込んで処理して破棄して、新しい画像を取り込んで…と連続して異なる画像を同じ処理をするプログラムを作ると error C2065: 'img' : 定義されていない識別子です。 error C2227: '->height' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。型は ''unknown-type'' です。 error C2227: '->width' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。型は ''unknown-type'' です … とたくさんのエラーがでてしまいます。 if文を使わずに同じ画像を何度も処理することはできるのですが… この解消法をわかる方は教えてください。 ぜひ、よろしくお願いします。

  • テクスチャーの歪み

    開発環境 Visual Studio 2005, OS Windows XP , SDK 現在、画像処理ソフトの開発をしています。 画像をテクスチャに読み込んで四角ポリゴンに貼り付けて4隅を動かすことでhotoShopのような自由変形をさせようとしていますが三角ポリゴンの歪みが出てしまいます。 何か歪みが出ない方法がありましたら教えて頂けると助かります。 宜しくお願いします。

  • OpenCV プログラムについて

    webカメラを表示するプログラムをつくりました。 しかし、webカメラのウィンドウが小さいのでフルウィンドウにして表示させたいです。 どうすればフルウィンドウでwebカメラを表示することができますか? 解答よろしくお願いします #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

専門家に質問してみよう