ZBLOG

cv::Mat 显示在QLabel上 按照一定图像比例缩放展示

要在 QLabel 上按照一定的比例缩放 cv::Mat 图像并显示,可以通过以下步骤实现:

  1. 读取和转换图像:将 OpenCV 的 cv::Mat 转换为 Qt 的 QImage
  2. 计算缩放比例:根据目标尺寸和原始图像尺寸计算缩放比例,并调整图像大小。
  3. 设置 QLabel 的 pixmap:将缩放后的 QImage 设置为 QLabel 的内容。

以下是详细的示例代码:

示例代码

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

QImage MatToQImage(const cv::Mat& mat) {
    // 检查是否是空矩阵
    if (mat.empty()) {
        return QImage();
    }

    switch (mat.type()) {
        case CV_8UC3: { // RGB
            cv::Mat rgb;
            cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB);
            return QImage(rgb.data, rgb.cols, rgb.rows, static_cast<int>(rgb.step), QImage::Format_RGB888);
        }
        case CV_8UC1: { // 灰度图
            return QImage(mat.data, mat.cols, mat.rows, static_cast<int>(mat.step), QImage::Format_Grayscale8);
        }
        default:
            qWarning("Unsupported image format");
            return QImage();
    }
}

void displayScaledImage(QLabel* label, const cv::Mat& image) {
    // 将 cv::Mat 转换为 QImage
    QImage qimg = MatToQImage(image);

    if (!qimg.isNull()) {
        // 设定目标宽度和高度
        int targetWidth = 800;   // 可以根据需要调整此值
        int targetHeight = 600;  // 可以根据需要调整此值

        // 计算缩放比例
        double aspectRatio = static_cast<double>(qimg.width()) / static_cast<double>(qimg.height());
        
        if ((targetWidth / aspectRatio) <= targetHeight) {
            targetHeight = static_cast<int>(targetWidth / aspectRatio);
        } else {
            targetWidth = static_cast<int>(targetHeight * aspectRatio);
        }

        // 缩放图片并创建 QPixmap
        QPixmap pixmap = QPixmap::fromImage(qimg.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio));

        label->setPixmap(pixmap);      // 设置到 QLabel
        label->resize(pixmap.size());   // 调整 QLabel 大小以适应图片 
    } else {
        qWarning("Failed to convert cv::Mat to QImage");
    }
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个 QLabel 
    QLabel label;

    // 读取图片(确保路径正确)
    cv::Mat image = cv::imread("path/to/your/image.jpg");

    displayScaledImage(&label, image); 

    label.show();   // 显示 QLabel

    return app.exec();
}

说明

  1. MatToQImage 函数

    • 功能与之前相同,将 cv::Mat 转换为 QImage
  2. displayScaledImage 函数

    • 接受一个指向 QLabel 的指针和要显示的 cv::Mat 图像。
    • 根据设定的目标宽度和高度,计算合适的比例来保持原始图像的宽高比。
    • 使用 .scaled() 方法进行缩放,并保持纵横比。
  3. 主函数

    • 创建应用程序、标签及加载图像,然后调用 displayScaledImage() 来显示处理后的图像。
  4. 注意事项

    • 确保使用的是有效且存在的图像路径。
    • 调整目标宽度和高度时,请根据您的实际需求来设置它们,以适应您的界面布局。

通过上述方式,您可以在不失真的情况下将 OpenCV 图像以一定比例缩放后展示在 Qt 的 QLabel 中。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21530

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?