2012-06-21 2 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); 

Но на самом деле резюме :: Mat :: нули (строки, перевалы, типа), так что код должен быть.

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. – JohnnyAce

+0

Извините, я не могу вам помочь; Я не так хорошо знаком с OGL. – Bob

Смежные вопросы