【问题标题】:Matrix extraction using OpenCV使用 OpenCV 提取矩阵
【发布时间】: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 窗口中正确显示未裁剪的内容。

标签: c++ image opencv opengl


【解决方案1】:

经过一番研究,我找到了解决问题的方法。图像看起来失真的原因是尽管图像已被裁剪,newimg.step / newimg.elemSize() 仍显示图像的原始大小。这意味着在输出图像中只有行和列的值发生了变化,但其中没有数据且不属于图像的像素仍然存在。这可能就是“后”图像右侧有灰色区域的原因。我可能对这个理论有误,因为我对这个主题没有深入的了解,但是一旦我在调用glTexImage2D 之前插入这一行,它就开始正常工作了:

glPixelStorei(GL_UNPACK_ROW_LENGTH, newimg.step / newimg.elemSize());

注意:由于我们是在操作 OpenGL 的像素存储,所以最好在操作之前推送状态:

glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);

完成后弹出:

glPopClientAttrib();

这是为了避免内存损坏。感谢 genpfault 为我指明了正确的方向。

参见8。了解您的像素存储状态了解更多详情。 https://www.opengl.org/archives/resources/features/KilgardTechniques/oglpitfall/

This 的帖子也很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多