2016-08-04 148 views
0

我試圖使用OpenGL的glGetTexImage()的輸出製作OpenCV Mat()。我試圖從中獲取信息的紋理是使用該調用進行的;使用glGetTexImage()獲得OpenCV Mat

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

所以我試圖做到這一點;

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); 

什麼我不知道是如果有人知道我應該設置的格式和glGetTexImage()來的類型,爲了這個工作。另外,我應該如何設置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

嗯,我真的不希望通過幀緩衝區,因爲我只使用OpenGL作爲OpenCV的端口,但也許我會給你的版本嘗試,如果沒有其他表面。謝謝! –

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); 

它始終是一個好主意,打電話glGetError(),如果您有什麼樣的問題得到所需的OpenGL性能。在這種情況下,會得到一個GL_INVALID_OPERATION錯誤的基礎上,在spec這種錯誤情況下:

格式是在表8.3和紋理圖像的內部格式的整數格式之一不是整數,或格式不是表8.3中的整數格式之一,內部格式是整數。