在使用 Qt 和 OpenCV 进行图像处理时,可能需要在 QImage
和 cv::Mat
之间进行转换。下面是一个将 QImage
转换为 cv::Mat
的示例代码:
QImage 转 cv::Mat
#include <QImage>
#include <opencv2/opencv.hpp>
cv::Mat QImageToCvMat(const QImage &image) {
// 确保输入的 QImage 是有效的
if (image.isNull()) {
return cv::Mat();
}
// 检查图像格式
switch (image.format()) {
case QImage::Format_RGB888: { // RGB格式
cv::Mat mat(image.height(), image.width(), CV_8UC3,
const_cast<uchar*>(image.bits()), image.bytesPerLine());
return mat.clone(); // 克隆数据,以确保独立于原始 QImage
}
case QImage::Format_RGBA8888: { // RGBA格式
cv::Mat mat(image.height(), image.width(), CV_8UC4,
const_cast<uchar*>(image.bits()), image.bytesPerLine());
return mat.clone(); // 克隆数据,以确保独立于原始 QImage
}
case QImage::Format_Grayscale8: { // 灰度图格式
cv::Mat mat(image.height(), image.width(), CV_8UC1,
const_cast<uchar*>(image.bits()), image.bytesPerLine());
return mat.clone(); // 克隆数据,以确保独立于原始 QImage
}
default:
qWarning("Unsupported format, converting to RGB888.");
return QPixmap(image).toImage().convertToFormat(QImage::Format_RGB888);
}
}
cv::Mat 转 QImage
如果需要将 cv::Mat
转换回 QImage
,可以使用以下函数:
#include <QImage>
#include <opencv2/opencv.hpp>
QImage CvMatToQImage(const cv::Mat &mat) {
switch (mat.type()) {
case CV_8UC3: { // BGR 格式,需转换为 RGB 格式
cv::Mat rgb;
cvtColor(mat, rgb, cv::COLOR_BGR2RGB);
return QImage((const uchar*)rgb.data, rgb.cols, rgb.rows, rgb.step[0],
QImage::Format_RGB888).copy();
}
case CV_8UC1: { // 灰度图格式
return QImage((const uchar*)mat.data, mat.cols, mat.rows,
mat.step[0], QImage::Format_Grayscale8).copy();
}
case CV_8UC4: { // BGRA 格式,需转换为 RGBA 格式
cv::Mat rgba;
cvtColor(mat, rgba, cv::COLOR_BGRA2RGBA);
return QImage((const uchar*)rgba.data, rgba.cols, rgba.rows,
rgba.step[0], QImage::Format_RGBA8888).copy();
}
default:
qWarning("Unsupported Mat type.");
return QImage();
}
}
使用方法
你可以按照以下方式使用这些函数:
// 从文件加载图像到QImage中并转换为cv::Mat:
QImage qImg("path/to/your/image.png");
cv::Mat cvImg = QImageToCvMat(qImg);
// 对cvImg进行操作...
// 将处理后的cv::Mat转换回QImage:
QImage resultImg = CvMatToQImage(cvImg);
// 保存结果:
resultImg.save("path/to/save/result_image.png");
注意事项
- 在上述代码中,我们使用了
clone()
方法以确保从QPixmap
中创建新的数据副本,这样当源对象销毁时不会影响生成的图像。 - 还要根据你的实际应用情况选择适当的颜色空间,并相应地转换颜色顺序(如 BGR 到 RGB)。
内容由零声教学AI助手提供,问题来源于学员提问