C++ 使用OpenGL和Kinect v2的QT5:错误的图像显示

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; 这意味着,我获得了带有

我想在Qt小部件中通过openGl显示kinect v2传感器的彩色图像。问题是,此图像的显示不正确

下面是我获取颜色框架的代码:

类别:

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);