glReadPixels不适用于非方形宽度和高度?

时间:2016-06-19 06:48:46

标签: opencv opengl

目前我的视口上的内容是:

enter image description here

这是我的导出图片方法。

void exportImage()
{
  int width = 200;
  int height = 100;
  GLubyte *data = new GLubyte[4*width*height];
  glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE, data);
  cv::Mat imageMat(width, height, CV_8UC4, data);
  cv::flip(imageMat, imageMat, 0);
  cv::imwrite("ok.jpg",imageMat);
}

当使用800x800时,(请不要介意黄色变蓝)

enter image description here

使用200x200时,

enter image description here

但是当使用200x100时,

void exportImage()
{
  int width = 200;
  int height = 100;
  GLubyte *data = new GLubyte[4*width*height];
  glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE, data);
  cv::Mat imageMat(width, height, CV_8UC4, data);
  cv::flip(imageMat, imageMat, 0);
  cv::imwrite("ok.jpg",imageMat);
}

enter image description here

首先,宽度变为高度,图像错误。它看起来像数组索引移位问题,但我无法理解为什么因为分配应该根据代码的宽度和高度而改变。

当我尝试在glReadPixels中交换宽度和高度时:

void exportImage()
{
  int width = 200;
  int height = 100;
  GLubyte *data = new GLubyte[4*width*height];
  glReadPixels(0,0,height,width,GL_RGBA,GL_UNSIGNED_BYTE, data);
  cv::Mat imageMat(width, height, CV_8UC4, data);
  cv::flip(imageMat, imageMat, 0);
  cv::imwrite("ok.jpg",imageMat);
}

enter image description here

图像看起来正确吗?但宽度和高度仍然交换??

1 个答案:

答案 0 :(得分:0)

好吧,我犯了一个非常愚蠢的错误。 glReadPixels实际上很好,但是cv :: Mat的初始化对应于行x cols,这意味着高度x宽度。因此,交换后,输出看起来很好。

void exportImage()
{
  int width = 200;
  int height = 100;
  GLubyte *data = new GLubyte[4*width*height];
  glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE, data);
  cv::Mat imageMat(height, width, CV_8UC4, data);
  cv::flip(imageMat, imageMat, 0);
  cv::imwrite("ok.jpg",imageMat);
}

enter image description here