1

OpenCV と OpenGL を使用して円を描画しようとしています。テクスチャ上に描画する必要があるため、このようにする必要があります。

現在、図面は次のようになっています。

間違った開いている CV イメージ

この画像を生成して描画するコードは次のとおりです。

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

ご覧のとおり、円は中央にあるはずで繰り返されていませんが、なぜ横軸で繰り返されているのかわかりません。

助言がありますか?

4

2 に答える 2

2

私が持っているコードでは、メソッドに送信されるパラメーターに間違いがありました。

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

于 2012-06-22T04:21:53.650 に答える
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);

私が助けてくれることを願っています!

于 2012-06-21T03:09:49.033 に答える