2016-08-04 50 views
0

OpenGLのglGetTexImage()からの出力を使用してOpenCV Mat()を作成しようとしています。情報を取得しようとしているテクスチャは、呼び出しを使用して作成されました。glGetTexImage()を使用してOpenCVマットを取得する

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, iWidth, iHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pImageData); 

ですので、これを使用しようとしました。誰もが、私はこれが動作するために)(glGetTexImageの形式や種類を設定するにはどうあるべきか知っている場合、私は疑問に思って何

unsigned char* texture_bytes = (unsigned char*)malloc(sizeof(unsigned char)*texture_width*texture_height * 3); 

    glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, texture_bytes); 

    Matrix = Mat(texture_height, texture_width, CV_8UC3, texture_bytes); 

です。また、Mat()の型を設定する必要がありますか?

コンテキストが正しく設定されており、入力されたテクスチャが正しいと仮定できます。 OpenGLを使用して画面にテクスチャを表示することでこれを確認しました。前もって感謝します!

+0

あなたの現在の試行にはどのような問題がありますか?あなたは全くデータを取得していませんか?または間違っているようなデータですか?パラメータが私に有効であるように見えても、 'glGetError()'を呼んでみてください。 –

+0

テクスチャからtexture_bytesデータを取得しようとすると、私の問題が発生します。 texture_bytesは空白を返します( "ffffffffffffffffff"のように)。はい、私は全くデータを取得していません。テクスチャがレンダリングされ、OpenGLでうまく表示されるので、データがそこにあることは肯定的ですが、OpenCVでは灰色の画面しか表示されません。私はこれが少し質問を明確にすることを願っています:) –

+0

修正、私はtexture_dataから得るように見える唯一のデータは、 "Ï¡¡¡ –

答えて

0

私はOpenGLからOpenCVへのデータを最近取得するという問題に直面しています。私はglGetTexImageを使っていませんでした。私が何をしたか

はオフスクリーンは次のように初期化されたテクスチャとフレームバッファにレンダリングされました:

GLuint texture; 
if (glIsTexture(texture)) { 
    glDeleteTextures(1, &texture); 
} 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glBindTexture(GL_TEXTURE_2D, 0); 

glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

その後、私の描画呼び出した後、私はglReadPixelsを使用してデータを取得する:

glPixelStorei(GL_PACK_ALIGNMENT, 1); 
glReadBuffer(GL_COLOR_ATTACHMENT0); 

cv::Mat texture = cv::Mat::zeros(height, width, CV_32FC3); 
glReadPixels(0, 0, width, height, GL_BGR, GL_FLOAT, texture.data); 

がそれを願っていますあなたを助けます。

+0

Hmmm私はOpenCVへのポートとしてOpenGLを使用しているだけなので、フレームバッファーを使わずに済むことを本当に望んでいましたが、他のものがなければあなたのバージョンを試してみます。ありがとう! –

0

あなたがglGetTexImage()コールとテクスチャの内部フォーマットに使用形式パラメータの不一致があります:あなたはこのケースで持って整数テクスチャについては、

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, iWidth, iHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pImageData); 
... 
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, texture_bytes); 

を、あなたが使用する必要がありますフォーマットglGetTexImage()に設定すると、整数テクスチャとして機能します。あなたの例では、それは次のようになります。

glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR_INTEGER, GL_UNSIGNED_BYTE, texture_bytes); 

あなたが問題希望OpenGLの動作を得るための任意の種類を持っている場合glGetError()を呼び出すために、常に良い考えです。このケースでは、仕様でこのエラー状態に基づいて、GL_INVALID_OPERATIONエラーを得ているでしょう:

形式は、表8.3の整数形式の一つであり、テクスチャ画像の内部形式は整数ではありませんか、 formatは表8.3の整数形式の1つではなく、内部形式は整数です。

関連する問題