gpt4 book ai didi

qt - 如何将 cv::Mat 转换为 QImage 或 QPixmap?

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:31 26 4
gpt4 key购买 nike

我试着环顾四周并尝试了我发现的一切,但还没有找到解决这个问题的方法。

我正在尝试通过单击按钮来更新 QT 应用程序中的图像。

在构造函数中,我设法显示了一个图像:

    cv::Mat temp = cv::Mat(*this->cv_size,CV_8UC3);
temp = cv::Scalar(0,255,155);
ui->image->setPixmap(QPixmap::fromImage( Mat2QImage(temp)));

然后我创建了一个按钮并将此功能链接到它

void UIQT::refreshImage(){
cv::Mat temp = cv::Mat(*this->cv_size,CV_8UC3);
temp = cv::Scalar(0,255,0);
ui->image->setPixmap(QPixmap::fromImage( Mat2QImage(temp)));
std::cout << "refreshed" << std::endl;
}

函数如下:

QImage UIQT::Mat2QImage(cv::Mat const& src) {
cv::Mat temp(src.cols,src.rows,src.type());
cvtColor(src, temp,CV_BGR2RGB);
QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);

return dest;
}

但是当我按下按钮时,整个图像变成了白色。有人有想法吗?

最佳答案

您的代码似乎无可救药地错综复杂,并且您做了很多不必要的事情。没有理由让 cv_size 成为指针。您应该只使用 cv::Size 的一个实例。您的 Mat2QImage 返回一个带有指向其数据的悬空指针的 QImage

下面的代码是一个完整的、经过测试的示例。它保留了其他不必要的 Ui 命名空间等,只是为了使其与您现有的代码库相似。

一些公开的 Mat2QImage 风格的方法被破坏了,因为它们返回一个 QImage,它使用垫的数据而不保留对它的引用。如果源垫不复存在,图像引用一个悬空指针,任何事情都可能发生。那是你的问题。以下版本在这方面是正确的。

#include <QApplication>
#include <QBasicTimer>
#include <QImage>
#include <QPixmap>
#include <QGridLayout>
#include <QLabel>
#include <opencv2/opencv.hpp>

namespace Ui { struct UIQT {
QLabel * image;
void setupUi(QWidget * w) {
QGridLayout * layout = new QGridLayout(w);
layout->addWidget((image = new QLabel));
}
}; }

class UIQT : public QWidget {
Q_OBJECT
Ui::UIQT ui;
QBasicTimer m_timer;
cv::Size m_size;
void timerEvent(QTimerEvent *);
public:
UIQT(QWidget * parent = 0);
~UIQT();
Q_SLOT void refreshImage();
};

void matDeleter(void* mat) { delete static_cast<cv::Mat*>(mat); }

static QImage imageFromMat(cv::Mat const& src) {
Q_ASSERT(src.type() == CV_8UC3);
cv::Mat * mat = new cv::Mat(src.cols,src.rows,src.type());
cvtColor(src, *mat, CV_BGR2RGB);
return QImage((uchar*)mat->data, mat->cols, mat->rows, mat->step,
QImage::Format_RGB888, &matDeleter, mat);
}

static cv::Scalar randomScalar() {
static cv::RNG rng(12345);
return cv::Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255));
}

static QPixmap pixmapFromMat(const cv::Mat & src) {
QImage image(imageFromMat(src));
return QPixmap::fromImage(image);
}

UIQT::UIQT(QWidget * parent) :
QWidget(parent),
m_size(100, 100)
{
ui.setupUi(this);
m_timer.start(500, this);
refreshImage();
}

UIQT::~UIQT() {}

void UIQT::timerEvent(QTimerEvent * ev) {
if (ev->timerId() != m_timer.timerId()) return;
refreshImage();
}

void UIQT::refreshImage() {
cv::Mat mat(m_size, CV_8UC3, randomScalar());
ui.image->setPixmap(pixmapFromMat(mat));
}

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
UIQT w;
w.show();
return app.exec();
}

#include "main.moc"

关于qt - 如何将 cv::Mat 转换为 QImage 或 QPixmap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22872075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com