私が望むのは、カメラにマーカーを表示し、見つけたら、たとえば次のように画像でオーバーレイすることです:( 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]
はマーカーに対してシフトされています。私は何が欠けていますか?マット座標からテクスチャ座標への変換/変換を行う必要があるようです。しかし、どのように?