【发布时间】:2016-02-22 23:25:38
【问题描述】:
我在使用 OpenCV 提取矩阵(裁剪)时遇到了一些麻烦。有趣的是,如果我不执行“裁剪”图像的行,一切正常。但如果我这样做了,我会在图像的位置看到水平的多色线条。
这是为了表明裁剪正确进行。
cv::imshow("before", newimg);
//the line that "crops" the image
newimg = newimg(cv::Rect(leftcol, toprow, rightcol - leftcol, bottomrow - toprow));
cv::imshow("after", newimg);
下面的代码是我将图像绑定到纹理的地方,以便我可以在 OpenGL 中使用它。
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, newimg.cols, newimg.rows,
0, GL_BGR, GL_UNSIGNED_BYTE, newimg.ptr());
glBindTexture(GL_TEXTURE_2D, 0);
后来画了。 . .
float h = size;
float w = size * aspectRatio; // of the image. aspectRatio = width / height
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y + h, z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + w, y + h, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x + w, y, z);
glEnd();
glDisable(GL_TEXTURE_2D);
所有这些都运行良好,当我注释掉我裁剪图像的那一行时,我看到在 OpenGL 窗口中绘制了正确的图像。我在裁剪前后检查了图像类型,但唯一的区别似乎是最终图像中的行数和列数减少了。
这是裁剪完成后绘制的图像。
【问题讨论】:
-
newimg.ptr()返回的指针是否与GL_UNPACK_ALIGNMENT的默认值兼容? -
我检查了裁剪前后的图像类型,两者都表示相同的格式
CV_8UC3(16)。我确信转换是有效的,因为当我注释掉裁剪线时,它会在 OpenGL 窗口中正确显示未裁剪的内容。