ZBLOG

从文件载入一张黑白 .png 图像到 Qt 库的 QImage,然后将 QImage 里的图像数据拷贝到新申请的内存中,且格式兼容 OpenCV 库的 cv::Mat

要从文件载入一张黑白(灰度).png图像到Qt的QImage,然后将其图像数据拷贝到新申请的内存中,使得格式兼容OpenCV的cv::Mat,你可以按照以下步骤进行。

以下是具体代码示例:

  1. #include <QImage>
  2. #include <opencv2/opencv.hpp>
  3. #include <stdexcept>
  4. cv::Mat QImageToCvMat(const QImage &image) {
  5. // 检查 QImage 是否有效
  6. if (image.isNull()) {
  7. throw std::runtime_error("Invalid QImage");
  8. }
  9. // 将 QImage 转换为适合 OpenCV 的格式(灰度)
  10. QImage converted = image.convertToFormat(QImage::Format_Grayscale8);
  11. // 创建 cv::Mat, 使用 data() 方法获取指向原始数据的指针
  12. cv::Mat mat(converted.height(), converted.width(), CV_8UC1, (void*)converted.bits(), converted.bytesPerLine());
  13. // 克隆以确保 cv::Mat 拥有自己的副本
  14. return mat.clone();
  15. }
  16. int main(int argc, char *argv[]) {
  17. QApplication app(argc, argv);
  18. // 从文件加载黑白 PNG 图像到 QImage
  19. QString filePath = "path_to_your_image.png"; // 替换为你的图片路径
  20. QImage image(filePath);
  21. try {
  22. cv::Mat mat = QImageToCvMat(image);
  23. // 显示或处理 OpenCV 的 Mat 对象
  24. cv::imshow("Loaded Image", mat);
  25. cv::waitKey(0); // 等待键盘输入以关闭窗口
  26. // 如果需要保存,可以使用:
  27. // cv::imwrite("output.png", mat);
  28. } catch (const std::runtime_error &e) {
  29. qDebug() << e.what();
  30. }
  31. return 0;
  32. }

说明:

  1. 加载图片: 使用 QImage image(filePath); 从指定路径加载黑白PNG图像。
  2. 转换格式: 使用 convertToFormat(QImage::Format_Grayscale8) 确保将图像转换为单通道灰度格式。
  3. 创建cv::Mat: 创建一个新的 cv::Mat,并使用 converted.bits() 获取原始图像数据。我们指定它是单通道 (CV_8UC1)。
  4. 克隆: 最后,我们通过调用 .clone() 创建了一个独立的副本,以确保在 QImage 被销毁后,cv::Mat 仍然有效。

注意事项:

  • 确保在 Qt 项目中正确链接 OpenCV 和 Qt 库。
  • 在 Qt 中显示或者处理图像时,需要注意 UI 主线程与 OpenCV 操作之间可能的冲突,尽量保持线程安全。
  • 根据你的需求调整窗口管理和事件循环等逻辑。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?