要从文件载入一张黑白(灰度).png
图像到Qt的QImage
,然后将其图像数据拷贝到新申请的内存中,使得格式兼容OpenCV的cv::Mat
,你可以按照以下步骤进行。
以下是具体代码示例:
#include <QImage>
#include <opencv2/opencv.hpp>
#include <stdexcept>
cv::Mat QImageToCvMat(const QImage &image) {
// 检查 QImage 是否有效
if (image.isNull()) {
throw std::runtime_error("Invalid QImage");
}
// 将 QImage 转换为适合 OpenCV 的格式(灰度)
QImage converted = image.convertToFormat(QImage::Format_Grayscale8);
// 创建 cv::Mat, 使用 data() 方法获取指向原始数据的指针
cv::Mat mat(converted.height(), converted.width(), CV_8UC1, (void*)converted.bits(), converted.bytesPerLine());
// 克隆以确保 cv::Mat 拥有自己的副本
return mat.clone();
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 从文件加载黑白 PNG 图像到 QImage
QString filePath = "path_to_your_image.png"; // 替换为你的图片路径
QImage image(filePath);
try {
cv::Mat mat = QImageToCvMat(image);
// 显示或处理 OpenCV 的 Mat 对象
cv::imshow("Loaded Image", mat);
cv::waitKey(0); // 等待键盘输入以关闭窗口
// 如果需要保存,可以使用:
// cv::imwrite("output.png", mat);
} catch (const std::runtime_error &e) {
qDebug() << e.what();
}
return 0;
}
说明:
- 加载图片: 使用
QImage image(filePath);
从指定路径加载黑白PNG图像。 - 转换格式: 使用
convertToFormat(QImage::Format_Grayscale8)
确保将图像转换为单通道灰度格式。 - 创建cv::Mat: 创建一个新的
cv::Mat
,并使用converted.bits()
获取原始图像数据。我们指定它是单通道 (CV_8UC1
)。 - 克隆: 最后,我们通过调用
.clone()
创建了一个独立的副本,以确保在QImage
被销毁后,cv::Mat
仍然有效。
注意事项:
- 确保在 Qt 项目中正确链接 OpenCV 和 Qt 库。
- 在 Qt 中显示或者处理图像时,需要注意 UI 主线程与 OpenCV 操作之间可能的冲突,尽量保持线程安全。
- 根据你的需求调整窗口管理和事件循环等逻辑。
内容由零声教学AI助手提供,问题来源于学员提问