1

OpenGL イメージを取得し、分析のために OpenCV にフィードしたい (OpenCV アルゴリズムのシミュレーターとして) が、それに関する多くの情報が見つかりません。 )。誰かがその方法を説明できますか?

編集:

ロボットの上にあるカメラをシミュレートするので、リアルタイムで 3D 環境をレンダリングし、それを Qt GUI でユーザーに表示します。実際の Web カメラ フィードまたはシミュレートされた 3D シーン (ロボットの動きに応じて変化) を使用するオプションをユーザーに提供し、OpenCV アルゴリズムは両方の入力に対して同じであるため、ユーザーは実際のフィードを使用せずにコードをテストできます。いつでもロボット。

4

3 に答える 3

3

おそらく関数glReadPixelsを探しているでしょう。OpenGL によって現在表示されているものは何でもバッファにダウンロードします。

unsigned char* buffer = new unsigned char[width*height*3];
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
cv::Mat image(height, width, CV_8UC3, buffer);
cv::imshow("Show Image", image);

OpenCV の場合は、おそらくフリップして BGR に変換する必要もあります。

編集: glReadPixels を使用するだけでは効率的な方法ではないため、フレームバッファとピクセル バッファ オブジェクトを使用して効率的に転送するサンプル コードを次に示し ます。 OpenGL でオフスクリーンをレンダリングするには?

于 2013-10-24T12:22:22.427 に答える
2

私は以前の研究プロジェクトでそれをしました。ここにはそれほど難しいことはありません。

あなたがしなければならないことは、基本的に次のとおりです。

  • テクスチャを OpenGL から事前に割り当てられたメモリ バッファに読み込みます。
  • OpenGL と OpenCV の間で座標フレームが異なる可能性があるため、何らかの幾何学的変換 (X および/または Y 座標の反転) を適用します。これは詳細ですが、視覚化に役立ちます (ヒント: F の文字が入ったテクスチャを使用して、反転する必要がある座標をすばやく見つけます!);
  • 事前に割り当てられたメモリ バッファの周りにOpenCVcv::Matオブジェクトを直接構築し、それを直接処理するか、他のマトリックス オブジェクトにコピーして処理することができます。

別の回答で示されているように、OpenGL テクスチャの読み取りは、glRead()関数を呼び出すだけです。実際の OpenGL コンテキストに依存する場合がありますが、得られるのは通常、データあたり 8 ビット (RGB / RGBA - チャネルあたり 8 ビット) の 3 つまたは 4 つのチャネルです。

色が重要な場合は、RGB 画像データを BGR 形式 (青 - 緑 - 赤) に変換する必要がある場合があります (必須ではありません)。歴史的な理由から、これが OpenCV のデフォルトのカラー チャネル順序です。cv::cvtColor(source, dest, cv::COLOR_RGB2BGR)これは、たとえばへの呼び出しで行います。

于 2013-10-24T09:29:07.170 に答える
2

研究のためにこれが必要でした。littleimp のアドバイスを参考にしましたが、色を修正して画像を反転させるのに時間がかかりました。

これが私が最終的に得たものです。

typedef Mat Image ;

typedef struct {
  int width;
  int height;
  char* title;
  float field_of_view_angle;
  float z_near;
  float z_far;
} glutWindow;

glutWindow win;

Image glutTakeCVImage() {
  // take a picture within glut and return formatted
  // for use in openCV
  int width = win.width;
  int height = win.height;
  unsigned char* buffer = new unsigned char[width*height*3];
  glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);
  Image img(height, width, CV_8UC3, buffer);
  Image flipped_img;
  flip(img,flipped_img,0);
  Image BGR_img;
  cvtColor(flipped_img,BGR_img, COLOR_RGB2BGR);
  return BGR_img;
}

誰かがこれが役立つことを願っています。

于 2015-05-23T11:17:56.293 に答える