【发布时间】:2013-04-15 14:46:11
【问题描述】:
我想知道如何将 cv::Mat 绘制到 QGLWidget 中。我找到了here 一种方法并尝试实现它。但是我的小部件是黑色的。
这是我的小部件的代码:
h 文件
#ifndef GLVIEWER_H
#define GLVIEWER_H
#include <QtOpenGL/QGLWidget>
#include <QtOpenGL/QtOpenGL>
#include <opencv2/core/core.hpp>
class GLViewer : public QGLWidget {
Q_OBJECT
public:
GLViewer(QWidget *parent = NULL);
void setNewFrame(cv::Mat newframe);
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
cv::Mat frame;
};
#endif // GLVIEWER_H
cpp 文件
#include "glviewer.h"
#include <iostream>
#include <QtGui/QMouseEvent>
GLViewer::GLViewer(QWidget *parent) : QGLWidget(parent) {
setMouseTracking(true);
frame = cv::Mat::ones(25, 50, CV_8UC3) * 255;
}
void GLViewer::setNewFrame(cv::Mat newframe) {
frame = newframe;
paintGL();
}
void GLViewer::initializeGL() {
std::cout << "initializeGL" << std::endl;
glViewport(0,0,this->width(), this->height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-this->width()/2, this->width()/2, this->height()/2, -this->height()/2, -1, 1);
}
void GLViewer::resizeGL(int w, int h) {
glViewport(0, 0, w, h);
// glMatrixMode(GL_PROJECTION);
// glLoadIdentity();
// gluOrtho2D(0, w, 0, h); // set origin to bottom left corner
// glMatrixMode(GL_MODELVIEW);
// glLoadIdentity();
}
void GLViewer::paintGL() {
//std::cout << "paint" << std::endl;
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1.0f, 0, 0, 1.0f);
glDrawPixels(frame.rows, frame.cols,
GL_RGB,
GL_UNSIGNED_BYTE,
frame.data);
}
由于我已经使用 'cv::Mat::ones(25, 50, CV_8UC3) * 255;' 初始化了 cv::Mat,我希望看到一个蓝色的小矩形,但是.. 什么也没发生,全黑的小部件.
谁能给我指出一个解决方案?
编辑
我试图将背景更改为红色,现在一切都是红色的。这是输出:
背景是正确的,但蓝色矩形..不是蓝色的,即使它看起来是一个矩形.. 发生了什么?我试图反转 frame.cols 和 frame.cols,以及 GL_BGR 而不是 GL_RGB 以及一些数据类型的随机试验(GL_UNSIGNED_SHORT 等),但没有什么比这更好的结果了..
【问题讨论】: