ZBLOG

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

要从文件载入一张黑白(灰度).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;
}

说明:

  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

注册

已经有帐号?