1

私が望むのは、カメラにマーカーを表示し、見つけたら、たとえば次のように画像でオーバーレイすることです:( imageと呼びましょう)

ここに画像の説明を入力

私がすることは:

1) opencv でウェブカメラを開きます。画像を読み込みます。キャプチャされたフレームでマーカーを検出します。frameに対するマーカーの座標を計算します。

#define WIDTH              600 //opengl window width
#define HEIGHT             440 //opengl window height
VideoCapture cap;
GLint window;
GLuint *textures = new GLuint[2];
vector <Point2f> coord(4);
int flag =0;
// Capture next frame
    Mat frame;
    cap >> frame;
    flip(frame,frame,1);
    aruco::CameraParameters CamParam;
    aruco::MarkerDetector MDetector;
    std::vector <Marker> Markers;
    float MarkerSize=170;

    //marker detection
    CamParam.readFromXMLFile("parametri_camera.yml");
    CamParam.resize( frame.size());
    MDetector.detect(frame, Markers, CamParam, MarkerSize);
    Mat image = imread("Immagine.png");
    if (Markers.size()!=0) flag =1;
    else flag =0;
    for (int i=0; i< Markers.size(); i++) {
        coord_marker(frame, Markers[i], CamParam, coord);
    }

2)画像フレームを 2 つのテクスチャに変換します。

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, 4,frame.cols, frame.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, frame.data);

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glBindTexture(GL_TEXTURE_2D, textures[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);

textures[1]3)マーカーの座標に対応して配置された 2 つのテクスチャを示します。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Set Projection Matrix
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, WIDTH, HEIGHT, 0); 

    // Switch to Model View Matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D, textures[0]);
    // Draw a textured quad
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(WIDTH, 0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(WIDTH, HEIGHT);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, HEIGHT);
    glEnd(); 

    if(flag ==1) {
    glBindTexture(GL_TEXTURE_2D, textures[1]);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((coord[1].x)),(GLfloat)(coord[1].y));
    glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((coord[2].x)),(GLfloat)(coord[2].y));
    glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((coord[3].x)),(GLfloat)(coord[3].y));
    glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((coord[0].x)),(GLfloat)(coord[0].y)); 
    glEnd();
    }
    glFlush();
    glutSwapBuffers();

結果は次のとおりです。

ここに画像の説明を入力

ご覧のとおり、textures[1]はマーカーに対してシフトされています。私は何が欠けていますか?マット座標からテクスチャ座標への変換/変換を行う必要があるようです。しかし、どのように?

4

1 に答える 1

0

コードにエラーが見つかりました。

openGL ウィンドウ サイズの設定が間違っています (ウィンドウ サイズがキャプチャされたフレームよりも小さかった)。キャプチャしたフレームのサイズ (640x480) でウィンドウのサイズを変更する必要がありました。このように、Mat フレーム内のマーカーの座標は、 内のマーカーの座標に対応しtextures[1]ます。

#define WIDTH              640 //opengl window width and captured frame width
#define HEIGHT             480 //opengl window height and captured frame height

ここに画像の説明を入力

これが誰かを助けることを願っています!

于 2013-02-11T21:43:40.567 に答える