当前位置: 首页 > news >正文

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++图像处理软件工程师。如果文章对你有帮助麻烦点个点赞关注收藏哦,你的点赞关注是我最大的动力,持续分享干货中···


http://www.mrgr.cn/news/12103.html

相关文章:

  • DBSCAN算法详解
  • Vulkan入门系列18 - 计算着色器(Compute Shader)
  • Linux(CentOS8)系统安装mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
  • fastapi知识点及应用
  • pyautogui的一些自动化示例,附代码
  • 计算机毕业设计选题推荐-OA办公管理系统-Java/Python项目实战
  • 金融涉案账户压降行动的实施成效与挑战
  • jenkins发送html邮件配置步骤与注意事项?
  • 认知杂谈25
  • SpringBoot -在Axis2中,RPCServiceClient调用WebService
  • Android PopupWindow弹窗动态显示在View的上下方,
  • 8月27日cs61c
  • Redis6.0新特性
  • 在我的博士科研生活中,SCI的英语写作一直是我的挑战。
  • Vue3+Ts封装input组件时遇到的问题
  • 【iOS端】基于Uniapp跨平台接入即构RTC+相芯美颜
  • APP封装安装配置参考说明
  • swift自定义数据集微调Qwen-7B大模型,转换模型后使用ollama跑起来
  • AutoGPT开源项目解读
  • Halcon20.11深度学习语义分割模型