簡體   English   中英

紋理坐標與cv :: Mat坐標不對應

[英]Texture coordinates don't correspond to cv::Mat Coordinates

我想要的是在相機上顯示一個標記,並找到它,然后在其上覆蓋圖像,例如:(讓我們調用圖像

在此處輸入圖片說明

我要做的是:

1)我使用opencv打開網絡攝像頭。 我加載圖像 我在捕獲的幀中檢測到標記。 計算標記相對框架的坐標。

#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)我將圖像轉換/轉換成兩個紋理。

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

3)我展示了兩個紋理,其中textures[1]的位置與標記的坐標相對應。

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]相對於標記移位。 我想念什么? 看來我需要將Mat坐標轉換為Texture坐標。 但是如何?

我在代碼中發現錯誤。

設置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

在此處輸入圖片說明

希望這會對某人有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM