要在 QLabel
上按照一定的比例缩放 cv::Mat
图像并显示,可以通过以下步骤实现:
- 读取和转换图像:将 OpenCV 的
cv::Mat
转换为 Qt 的QImage
。 - 计算缩放比例:根据目标尺寸和原始图像尺寸计算缩放比例,并调整图像大小。
- 设置 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();
}
说明
MatToQImage 函数:
- 功能与之前相同,将
cv::Mat
转换为QImage
。
- 功能与之前相同,将
displayScaledImage 函数:
- 接受一个指向
QLabel
的指针和要显示的cv::Mat
图像。 - 根据设定的目标宽度和高度,计算合适的比例来保持原始图像的宽高比。
- 使用
.scaled()
方法进行缩放,并保持纵横比。
- 接受一个指向
主函数:
- 创建应用程序、标签及加载图像,然后调用
displayScaledImage()
来显示处理后的图像。
- 创建应用程序、标签及加载图像,然后调用
注意事项:
- 确保使用的是有效且存在的图像路径。
- 调整目标宽度和高度时,请根据您的实际需求来设置它们,以适应您的界面布局。
通过上述方式,您可以在不失真的情况下将 OpenCV 图像以一定比例缩放后展示在 Qt 的 QLabel 中。
内容由零声教学AI助手提供,问题来源于学员提问