• 締切済み

カメラで撮影した画像をOpenGLで表示する方法

webカメラで撮影した映像を,OpenGLを用いて表示することを考えております. 撮影した映像を,できる限り高速に表示する方法を教えていただけないでしょうか? 用途としては,仮想世界の視点移動に合わせて,カメラで撮影した画像を張り付けたポリゴンを 自由な視点から観察することを考えています. 私の考えつく解決策は,以下の通りです. 1.OpenGLの背景(バックバッファ)の領域を指定し,書き込む 2.ポリゴンにテクスチャマッピング 2.について実装してみたのですが,表示速度がいまひとつでした. 実装としては,テクスチャ用画像を,毎フレーム更新して, テクスチャマッピングする方法をとっています. コードを抜粋したものは,以下の通りです. ------------------------------------ glBindTexture(GL_TEXTURE_2D, g_texture[0]);//テクスチャの指定 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texture_img[0]->width,texture_img[0]->height, GL_RGB,GL_UNSIGNED_BYTE,texture_img[0]->imageData); ---------------------------------- ※texture_img[0]を毎フレーム更新して,テクスチャマッピング お忙しいと思いますが, アドバイスをいただけますと幸いです. よろしくお願いいたします.

みんなの回答

回答No.2

画像形式がOpenCVだったので補足ですが, OpenCVのキャプチャを使っている場合は, それ自体が遅い可能性もあるのでご注意を. キャプチャ自体が遅い場合は, 面倒ですがキャプチャ部分はOpenCVを使わず, DirectShowなどで実装すると速くなるかもです. なお,画像サイズによっても 随分とフレームレートが変わってきます.

回答No.1

OpenGLを久しく扱っていないので怪しいですが, 2.で実装された表示速度に関しては, gluBuild2DMipmaps関数だとミニマップの生成で オーバーヘッドが生じていると思われるので, gluBuild2DMipmaps関数の代わりに glTexImage2D関数で実装してみると ちょっと速くなるかもです.

関連するQ&A

  • C言語のOpenGLで複数のテクスチャをロード方法

    こんにちは、 よく探してたが、 C言語のOpenGLで一つだけじゃなくて複数のテクスチャをロードする方法は? 見つかったコードは 「一つだけのテクスチャをロードする」 ーーーーーーーーーーー void LoadGLTextures() { // Load Texture Image *image1; // allocate space for texture image1 = (Image *) malloc(sizeof(Image)); if (image1 == NULL) { printf("Error allocating space for image"); exit(0); } if (!ImageLoad("Data/01.bmp", image1)) { exit(1); } // Create Texture glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d texture (x and y size) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); }; ーーーーーーーーーーー お願いします

  • OpenGLでのコンター表示

    OpenGLにて、物体表面(ポリゴン表面)上に、温度などの観測値の分布図をコンター表示するプログラムを組んでいます。 現在考えているのは、事前処理にて観測値に基づく色分布を求めこれを基にテクスチャの画像を自作し、後は、OpenGLの通常の処理でポリゴンに貼り付けることを考えていますが、もっと簡単な方法がないかと探しているところです。 当方、OpenGLについて初歩レベルであり、これについてどのようなアプローチがあるか、まったく別の方法も含めて、いろいろと模索しておりますので、ご助言いただければ幸いです。 よろしくお願いします。

  • OpenGL テクスチャを縮小表示すると縞模様が…

    こんにちは。お知恵をお借りしたく質問致します。 OpenGLのglTexImage2D関数でテクスチャを作り、Windowsフォームアプリケーション上に表示する際に起きた問題です。 なお、GLSLフラグメントシェーダでテクスチャは編集されています。 そのシェーダを利用した結果を表示すると、dot by dotで表示した際は正常に表示されるのですが、縮小して表示するとモアレと言いますか、縞模様が出てしまいます。※画像参照 また、縮小と言いますのはWindowsFormアプリ内のOpenGL描画用コントロール(glControl)そのものをリサイズするという意味で、テクスチャを作成する際に何か縮小操作を行ったというわけではありません。 テクスチャの貼付は以下のように行っています。 GL.Viewport(0, 0, glControl.Width, glControl.Height); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.Enable(EnableCap.Texture2D); GL.Begin(BeginMode.Quads); { GL.TexCoord2(0, 0); GL.Vertex2(-1, 1); GL.TexCoord2(1, 0); GL.Vertex2(1, 1); GL.TexCoord2(1, 1); GL.Vertex2(1, -1); GL.TexCoord2(0, 1); GL.Vertex2(-1, -1); } GL.End(); GL.Disable(EnableCap.Texture2D); glControl.SwapBuffers(); テクスチャ(1920x1080、RGBA)自体の作成が(理由は不明ですが)縮小時のみおかしくなっている、又はテクスチャの貼り方やビューポート周りの設定不足のように思って居るのですが、原因が掴めていない状況です。 参考までに、補間方法を変えた際の違いも一応スクリーンショットに撮りましたのでよろしければご覧ください。 たった今、glGetTexImageという関数で、作成したテクスチャを取得できるらしいということが分かり、これを用いて縮小表示している際もテクスチャそのものが正常に作成されているかどうかを確認しようと思っています。(が、環境が手元に無く、この確認は明日の朝となります。) この原因及び対処法など、解決の手助けとなるようなことがありましたら何でも構いませんので教えていただきたいです。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • Openglでテクスチャを透明にする方法について

    Microsoft Visual C++ 2008 Express Edition を使ってtgaファイルをテクスチャとして取り込んで表示するプログラムを作っております. Openglのスポットライト機能を使ってテクスチャを照らしたいと考えています. しかし,どこかのプログラミングがおかしいのか,テクスチャの張り付けに指定された座標4点付近にライトが当たったときでないとテクスチャが光りません. 方法がわからなかったので,テクスチャを大きな球体の内部に配置し,球体の内部からスポットライトでテクスチャ方向を照らすようにしました. 添付した図の左下にスポットライトが白っぽく見えているのは,この大きな球体の内部を照らした光となっています. このように球体内部がスポットライトで照ったので,後はテクスチャさえ透明にすることができれば,間接的にテクスチャをスポットライトで照らしているような感じで見えるのではないかと考えています. しかし肝心のテクスチャを透明にする方法が全くわかりません.(´・ω・) アルファ値というのを使ったり,ブレンド?を使ったりしたらできるのでは,と思ったのですが,どこにどうプログラムしたらいいのかの具体的な説明がなかったので,わかりませんでした(´・ω・) テクスチャを透かして,奥の大きな球体内部を照らすことができれば,その明るさで半透明の手前のテクスチャもうっすら光るのではないかと考えています. わかる方,教えてください. 本当に困ってます;w; 今のプログラム内部のテクスチャの部分は以下に書きます. よろしくお願いします><; void initTexture(void) { FILE *fp; int x, z; /* texture file open */ if((fp=fopen("ougonzan.tga", "rb"))==NULL){ fprintf(stderr, "texture file cannot open\n"); return; } fseek(fp, 18, SEEK_SET); for(x=0; x<TEX_HEIGHT; x++){ for(z=0; z<TEX_WIDTH; z++){ image[x][z][2]=fgetc(fp);/* B */ image[x][z][1]=fgetc(fp);/* G */ image[x][z][0]=fgetc(fp);/* R */ image[x][z][3]=fgetc(fp);/* alpha */ } } fclose(fp); } void displayTexPolygon(void) { glEnable(GL_TEXTURE_2D); glBegin(GL_TRIANGLE_FAN); glTexCoord2f(0.0, 0.0); glVertex3f(-16.0,-12.0, 5.0); //左下 glTexCoord2f(0.0, 1.0); glVertex3f(-16.0, 12.0, 5.0); //左上 glTexCoord2f(1.0, 1.0); glVertex3f( 16.0, 12.0, 5.0); //右上 glTexCoord2f(1.0, 0.0); glVertex3f( 16.0,-12.0, 5.0); //右下 glEnd(); glDisable(GL_TEXTURE_2D); } void display(void) { static const float floor_Color[] = { 1.0, 1.0, 1.0, 1.0 }; static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 }; static GLfloat yellow[] = { 0.8, 0.8, 0.2, 0.0 }; static GLfloat white[] = { 1.0, 1.0, 1.0, 0.0 }; static float spin=0.0; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //gluLookAt( 視点の位置x,y,z, 視界の中心位置の参照点座標x,y,z, 視界の上方向のベクトルx,y,z); gluLookAt( 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0); // 内側から //集中型スポットライト //glLightfv(光源番号, パラメータ, パラメータの値); glLightfv(GL_LIGHT0, GL_POSITION, SpotLight.pos); //光源の位置[pos] glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, SpotLight.spotDir); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, SpotLight.spotCutoff); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, SpotLight.spotExp); //巨大な球体 glPushMatrix(); glTranslated(0.0, 0.0, 7); glMaterialfv(GL_FRONT, GL_DIFFUSE, white); glutSolidSphere(60, 10000, 10000); glPopMatrix(); glPushMatrix(); glPopMatrix(); glPushMatrix(); glClearColor(0.0, 0.0, 1.0, 0.5); glTranslatef(0.0, 0.0, 45.0); //テクスチャの位置設定 // glRotatef(spin, 0.0, 1.0, 0.0); //テクスチャの回転 glColor4f(1.0, 0.0, 0.0, 0.0); //テクスチャの色設定 displayTexPolygon(); } spin+=1.0; glPopMatrix(); glFlush(); glutSwapBuffers(); }

  • OpenGLからDirect3Dへの移行

    今までGLはOpenGLを使用していたのですが、今回、Windows依存命令を書くこととなり、これを機会としてDirect3Dへの移行を考えております。 そこで、Direct3Dでの3Dの処理を理解しようと基礎的な内容のサイトを探したのですが、まったく見つからなく困っています。 ウインドウの作成から、ポリゴン1つを画面に表示するまでを解説したサイトや、 DirectXの基本的な処理の考え方を解説したサイトがありましたら、教えてください。

  • OpenGL 画像のα値操作

    こんにちは。 現在、授業の一環でGLUTを用いたOpenGLのプログラムを作っています。 そのプログラムの機能の中に、読み込んだ画像のα値を記憶した後、キー操作によって表示・非表示を切り替える機能を作ろうとしています。 目的の機能自体は一応途中まで(各ピクセルのα値を255⇔0への切り替え)は作れたのですが、原理がよく分かりません。 具体的に書くと、(幅)×(高さ)×(色のチャンネル数) の画像を読み込んだのに、4倍の高さの範囲までα値に関する処理を加えないと、処理後の効果が画像全体に現れないのです。 下にプログラムの断片を張るので、わかる方がいたら解説お願いします。 出来れば、後々のために理由を知っておきたいので。 -*-*-*-*-*-*-*-*-*- /* テクスチャの情報を格納する構造体 */ typedef struct{ unsigned int name; /* 識別番号 */ unsigned char* data; /* 画像のデータ */ int width; /* 画像の幅 */ int height; /* 画像の高さ */ int channels; /* 画像の色成分の数 */ }texture; /* テクスチャ(グローバル変数) */ texture a; /* 画面表示用の関数 */ void display (void) {  /* 初期化 */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 透明色を描けるようにする */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  /* 描画 */ glDrawPixels(a.width, a.height, GL_RGBA, GL_UNSIGNED_BYTE, a.data); glutSwapBuffers (); } /* α値の操作(代入値がかわるだけなので、255にする方は省略) */ void alpham(void) { int i, j; for (i = 0; i < a.height * 4; ++i) { for (j = 0; j < (a.width); ++j) { a.data[(a.width * i) + (a.channels * j) +3] = 0; } } } ※画像データ の メモリ確保サイズ a.data = (unsigned char*) malloc(width * height * channels)

  • リアルタイムで多数の3角形ポリゴン(2D)を描画したい

    リアルタイムでテクスチャを貼った多数の3角形ポリゴン(2D)をアルファブレンドを加味して描画したいのですが、OpenGL,DirectX等は使わずに自前のコードで実装したいのです。参考になるアルゴリズムを紹介したサイト、ソースコードなどを掲載しているサイトなどありましたら教えてください。検索のヒントになるワードでも結構です。お願いします。

  • Lightwave8.0のテクスチャーデータについて

    はじめまして LightWave8.0(以下LW)のテクスチャーデータについて質問させていただきます. 現在進めている作業として, LWのモデラーでUVマッピングも使ったテクスチャ付モデリングデータ をOpenGLプログラミングで呼び出す,ということをやっております. しかしながら,LWで作ったモデリングデータを他のソフト(Deep Exploration, メタセコイヤなど) で表示するとUVマッピングで貼り付けたテクスチャーが反映されません. 当然,それらのソフトで他の形式に変換するとテクスチャーが失われてしまいます. テクスチャマッピングはフォーマット間で互換性がないのでしょうか? LW上で施したUVマッピングがOpenGLで呼び出したそのモデルどうやって反映させるのか, いい方法を知っている方がいましたら教えてください. OpenGLプログラミングで再度テクスチャマッピングをするしかないのでしょうか? それと基本的なことをお聞きしますが, 一般的なモデリングデータにはどれぐらいのテクスチャ情報が入っているのでしょうか. サーフェイスのRGB値はどの表示ソフトを使っても同様に再現されるので含まれているとは思いますが,画像ファイルのリンク,またはテクスチャー画像そのものが含まれているフォーマットというのもあるのでしょうか? ちなみにLWOファイルからCppファイルに変換するのはRight Hemisphere製のDeep Explorationというソフトを使用しています. いろいろと質問してしまいましたが, よろしくお願いします.

  • OPENGLで

    OPENGLで、立体の三角錐を書いたのですが、 底抜けの三角錐になってしまいました。 プログラムは、 GLdouble p0[]={0.0,0.0,0.0}; GLdouble p1[]={1.0,0.0,0.0}; GLdouble p2[]={0.0,1.0,0.0}; GLdouble p3[]={0.0,0.0,1.0}; glBegin(GL_POLYGON); // ストリップ設定 glColor3d(1.0, 0.0, 0.0); // 赤 glVertex3dv(p0); glVertex3dv(p2); glVertex3dv(p1); glColor3d(0.0, 1.0, 0.0); // 青 glVertex3dv(p0); glVertex3dv(p1); glVertex3dv(p3); glColor3d(0.0, 0.0, 1.0); // 緑 glVertex3dv(p0); glVertex3dv(p3); glVertex3dv(p2); glColor3d(1.0, 1.0, 1.0); // 白 glVertex3dv(p1); glVertex3dv(p2); glVertex3dv(p3); glEnd(); glPopMatrix(); です。白の部分の底がかけていないです。。。 アドバイスくださいm(_ _)m

  • 【C++でOpenGL】平面から立体を作るには

    こんにちは。最近大学の研究にOpenGLを利用しようと思っている者です。 今,2次元座標上に平面図形を描画し,それを底面をその形のまま 3次元座標上に立体として起こす,という点で悩んでいます。 現在は,3次元座標上のx,y平面にGL_POLYGONで多角形を描画し, for文でz軸方向に繰り返し描画するよう設定していて, 擬似的に立体っぽくしてはいるのですが, 真横からみるとやはり平面と平面の隙間が目立って上手くいきません。 繰り返し回数を増やし,1回のz座標の増加量を小さくすると, 隙間はあまり目立たなくなるのですが,やはり実行時間が大幅にかかってしまいます。 OpenGLで底面が多角形の3Dオブジェクトを描画する方法を ご存知の方がいらっしゃいましたら,ぜひご指導お願い致します。 また,「こうした方がもっと効率良いのでは?」という意見もございましたら, ぜひお願い致します! 殆ど初心者ですので,受け答えなどに至らない点がございましたらすみません。

専門家に質問してみよう