VS环境中使用QT、OpenCV进行简易图像处理(附源码)

1.背景

在VS2022中,结合QT开发框架,使用OpenCV开源图像处理库,实现在QT界面中完成简易的图像处理,这里展示采用了灰度化处理,其它图像处理操作依据具体场景编写即可。

2.图像格式问题

在QT中,采用的是QImage,QPixmap,而在OpenCV中采用的是Mat,两者不能混淆,在QT中进行图像的展示不能直接使用Mat格式图片,所以会存在图像格式转换问题。关于图像格式互相转换的代码为:

cv::Mat imgToMat(QImage& image)
{
    cv::Mat mat;
    switch (image.format()) {
    case QImage::Format_RGB32:
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_RGB888:
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR);
        break;
    case QImage::Format_Indexed8:
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    default:
        throw std::runtime_error("Unsupported QImage format");
    }
    return mat;
}
QImage matToImg(cv::Mat& mat)
{
    switch (mat.type()) {
    case CV_8UC4: {
        QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB32);
        return image;
    }
    case CV_8UC3: {
        QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return image.rgbSwapped();
    }
    case CV_8UC1: {
        QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        return image;
    }
    default:
        throw std::runtime_error("Unsupported cv::Mat format");
    }
}
QPixmap matToPix(cv::Mat& mat)
{
    QImage image = matToImg(mat);
    QPixmap pixmap = QPixmap::fromImage(image);
    return pixmap;
}
cv::Mat pixToMat(QPixmap& p)
{
    QImage image = p.toImage();
    cv::Mat mat = imgToMat(image);
    return mat;
}

需要注意的是,在进行imgToMat过程当中的mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());其中的constBits()有时候并不会起作用,改为bits()即可。了解了一下发现两者都是指向图像像素数据的指针,一个是常量的,只可读,另一个非常量,是可修改的。但是本身都是复制操作,不知道为什么会产生这个bug。

3.ui布局及代码

在图片布局当中,采用的是四个Label,两个存放文字的Label,两个存放图片的Label,Label通过设置pixmap可以摆放图片。
在这里插入图片描述
相关图像处理代码如下(代码中的originImage代表存放原图的Label名字,TransAfterImage代表存放处理后的Label名字):

  QImage image("F://imgs//CSDN_Credic1017.jpg");
  QPixmap pixmap = QPixmap::fromImage(image);
  ui.originImage->setPixmap(pixmap);
  // 图片适应窗口大小
  ui.originImage->setScaledContents(true);

  cv::Mat img = pixToMat(pixmap);
  cv::Mat gray;
  cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
  QPixmap grayPixmap = matToPix(gray);
  ui.TransAfterImage->setPixmap(grayPixmap);
  ui.TransAfterImage->setScaledContents(true);

在进行操作后,最终效果图如下:

在这里插入图片描述

4.总结

本次博客展示了如何在QT上如何进行简单的图像处理操作,虽然简单,但是涉及了图像格式问题,图像显示方式选取比较常用的点。下一步将对图像处理进行更深层次的应用,结合可视化框架QT。
往期好文推荐
VS2022搭建QT及OpenCV环境
C++ QT使用stackwidget实现页面切换(含源码)

我是乐于分享C++、QT、图像处理深度学习的Credic,是一个在职的C++图像处理软件工程师。如果文章对你有帮助麻烦点个点赞关注收藏哦,你的点赞关注是我最大的动力,持续分享干货中···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值