C++ 使用OpenGL和Kinect v2的QT5:错误的图像显示
我想在Qt小部件中通过openGl显示kinect v2传感器的彩色图像。问题是,此图像的显示不正确 下面是我获取颜色框架的代码: 类别:C++ 使用OpenGL和Kinect v2的QT5:错误的图像显示,c++,qt,opencv,opengl,C++,Qt,Opencv,Opengl,我想在Qt小部件中通过openGl显示kinect v2传感器的彩色图像。问题是,此图像的显示不正确 下面是我获取颜色框架的代码: 类别: cv::Mat ColorMap; std::vector<BYTE> colorBuffer; int color_width; int color_height; 这意味着,我获得了带有
cv::Mat ColorMap;
std::vector<BYTE> colorBuffer;
int color_width;
int color_height;
这意味着,我获得了带有alpha通道的BGR格式的颜色信息,并将其复制到带有4个通道(BRGA)的矩阵中,每个通道有8个比特,从0到255。对吗
在下一步中,我将其调整为与小部件相同的大小:
Kinect->CreateFrame();
cv::Mat GUIColorImage;
Kinect->ColorMap.copyTo(GUIColorImage);
cv::resize(GUIColorImage,GUIColorImage,
cv::Size(ui->Left_Widget_Color->width(),ui->Left_Widget_Color->height()));
然后我尝试了两种转换方法:
1.转换为BGR
2.转换为8UC3(8位,无符号字符,3个通道(与BGR相同?)
1:GUIColorImage.convertTo(GUIColorImage,CV_BGRA2BGR)代码>
2:GUIColorImage.convertTo(GUIColorImage,CV_8UC3)代码>
但没有解决办法有效
转换后,我尝试通过以下方式在openGl上显示:
LeftWidgetColor.UpdateImage(GUIColorImage);
LeftWidgetColor是QOpenGLWidget:
标题:
class RenderWidget : public QOpenGLWidget
{
Q_OBJECT
public:
RenderWidget(QWidget *parent);
~RenderWidget();
void UpdateImage(cv::Mat newimage);
void initializeGL();
void paintGL();
private:
int width;
int height;
GLuint texture;
cv::Mat image;
signals:
void info(QString msg);
void error(QString msg);
void DepthValueAt(cv::Point2i DepthPosition);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
};
代码:
我想问题在于:
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0,
3, image.cols, image.rows, 0,
GL_BGR, GL_UNSIGNED_BYTE, image.data);
但是我找不到它。我已经声明3通道,BGR,8位=1字节为无符号。有人知道错误在哪里吗
如果我在imshow(openCv类)上显示它,它工作得很好
我的错误是,我使用了cv::Mat::convertTo():
但是
他们写道,convertTo()不应用于转换格式(仅用于更改数据类型)。cv::cvtColor是正确的函数,它对我来说很好。因此,我将转换从:
GUIColorImage.convertTo(GUIColorImage,CV_BGRA2BGR);
到
嗨,塞巴斯蒂安,谢谢你的回答。我在您的链接中找到了解决方案,原因如下:
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0,
3, image.cols, image.rows, 0,
GL_BGR, GL_UNSIGNED_BYTE, image.data);
GUIColorImage.convertTo(GUIColorImage,CV_BGRA2BGR);
cv::cvtColor(GUIColorImage,GUIColorImage,CV_BGRA2BGR);