目前我的视口上的内容是:
这是我的导出图片方法。
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时,(请不要介意黄色变蓝)
使用200x200时,
但是当使用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);
}
首先,宽度变为高度,图像错误。它看起来像数组索引移位问题,但我无法理解为什么因为分配应该根据代码的宽度和高度而改变。
当我尝试在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);
}
图像看起来正确吗?但宽度和高度仍然交换??
答案 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);
}