2012-06-21 3 views
1

OpenCV 및 OpenGL을 사용하여 원을 그리려하고 있습니다. 그리기가 텍스처에 있어야하기 때문에 이렇게해야합니다.OpenCV 및 OpenGL의 잘못된 그리기

현재 도면은 다음과 같습니다

Wrong Open CV Image

이 이미지를 생성하고 다음과 같이이 그리는 코드 :

class Texture 
{ 
    void setup() 
    { 
     glEnable(GL_TEXTURE_2D); 
     glGenTextures(1, &uid); 
     glBindTexture(GL_TEXTURE_2D, uid); 
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S , GL_REPEAT); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
     glBindTexture(GL_TEXTURE_2D, 0); 
     glDisable(GL_TEXTURE_2D); 
    } 
    ... 
    void setData(unsigned char * data, uint width, uint height, GLint internalformat, GLenum format) 
    { 
     glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, uid); 
     glTexImage2D( GL_TEXTURE_2D, 
         0, 
         internalformat, 
         width, 
         height, 
         0, 
         format, 
         GL_UNSIGNED_BYTE, 
         data); 
     glBindTexture(GL_TEXTURE_2D, 0); 
     glDisable(GL_TEXTURE_2D); 
    } 
    ... 
    void draw(float x, float y, float scale) 
    { 
     glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, uid); 
     glBegin(GL_QUADS); 
      glTexCoord2i(0, 0);  glVertex2i(x, y); 
      glTexCoord2i(0, 1);  glVertex2i(x, y + height * scale); 
      glTexCoord2i(1, 1);  glVertex2i(x + width * scale, y + height * scale); 
      glTexCoord2i(1, 0);  glVertex2i(x + width * scale, y); 
     glEnd(); 
     glBindTexture(GL_TEXTURE_2D, 0); 
     glDisable(GL_TEXTURE_2D); 
    } 
    ... 
}; 

class App 
{ 
    Texture tex; 
    ... 
    void update() 
    { 
     const int w_mask_cv = 640; 
     const int h_mask_cv = 480; 

     cv::Mat mask_cv = cv::Mat::zeros(w_mask_cv, h_mask_cv, CV_8UC1); 
     cv::circle(mask_cv, cv::Point(w_mask_cv/2, h_mask_cv/2), 15, cv::Scalar(255)); 

     tex.setData(mask_cv.data, w_mask_cv, h_mask_cv, GL_LUMINANCE, GL_LUMINANCE); 
    } 
    void draw() 
    { 
     tex.draw(0, 0, 1); 
    } 
    ... 
}; 

당신이 원이 있어야하는데 볼 수 있듯이 중간에 그리고 반복되지 않지만, 나는 그것이 수평축상에서 반복되는 이유를 모른다.

제안 사항?

답변

1

실수는 매개 변수에서 매개 변수로 보내고 코드에 있습니다.

cv::Mat mask_cv = cv::Mat::zeros(w_mask_cv, h_mask_cv, CV_8UC1); 

실제로 cv :: Mat :: zeros (rows, cols, type)이므로 코드는 비슷해야합니다.

cv::Mat mask_cv = cv::Mat::zeros(h_mask_cv, w_mask_cv, CV_8UC1); 

바보 어떤 오류 : P

+0

네, 저도 오래 전에 저와 함께있었습니다. :) –

1

GL_TEXTURE_MIN_FILTER를 설정해보십시오.

glTexParameteri(GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

포장은 GL_TEXTURE_WRAP_S/T를 사용하십시오.

glTexParameteri(GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_WRAP_S, GL_CLAMP); 

희망이 있습니다.

+0

내가 glTexParameteri 사용하고 (GL_TEXTURE_MIN_FILTER을 GL_LINEAR); 및 glTexParameteri (GL_TEXTURE_WRAP_S, GL_REPEAT); GL_CLAMP 함께 시도했지만 변경 사항이 없습니다. Texture 클래스에 setup 함수를 추가했습니다. – JohnnyAce

+0

죄송합니다. 저는 당신을 도울 수 없습니다. 나는 OGL에 그렇게 좋지 않다. – Bob