ZBLOG

QImage转cv::mat

在使用 Qt 和 OpenCV 进行图像处理时,可能需要在 QImagecv::Mat 之间进行转换。下面是一个将 QImage 转换为 cv::Mat 的示例代码:

QImage 转 cv::Mat

  1. #include <QImage>
  2. #include <opencv2/opencv.hpp>
  3. cv::Mat QImageToCvMat(const QImage &image) {
  4. // 确保输入的 QImage 是有效的
  5. if (image.isNull()) {
  6. return cv::Mat();
  7. }
  8. // 检查图像格式
  9. switch (image.format()) {
  10. case QImage::Format_RGB888: { // RGB格式
  11. cv::Mat mat(image.height(), image.width(), CV_8UC3,
  12. const_cast<uchar*>(image.bits()), image.bytesPerLine());
  13. return mat.clone(); // 克隆数据,以确保独立于原始 QImage
  14. }
  15. case QImage::Format_RGBA8888: { // RGBA格式
  16. cv::Mat mat(image.height(), image.width(), CV_8UC4,
  17. const_cast<uchar*>(image.bits()), image.bytesPerLine());
  18. return mat.clone(); // 克隆数据,以确保独立于原始 QImage
  19. }
  20. case QImage::Format_Grayscale8: { // 灰度图格式
  21. cv::Mat mat(image.height(), image.width(), CV_8UC1,
  22. const_cast<uchar*>(image.bits()), image.bytesPerLine());
  23. return mat.clone(); // 克隆数据,以确保独立于原始 QImage
  24. }
  25. default:
  26. qWarning("Unsupported format, converting to RGB888.");
  27. return QPixmap(image).toImage().convertToFormat(QImage::Format_RGB888);
  28. }
  29. }

cv::Mat 转 QImage

如果需要将 cv::Mat 转换回 QImage,可以使用以下函数:

  1. #include <QImage>
  2. #include <opencv2/opencv.hpp>
  3. QImage CvMatToQImage(const cv::Mat &mat) {
  4. switch (mat.type()) {
  5. case CV_8UC3: { // BGR 格式,需转换为 RGB 格式
  6. cv::Mat rgb;
  7. cvtColor(mat, rgb, cv::COLOR_BGR2RGB);
  8. return QImage((const uchar*)rgb.data, rgb.cols, rgb.rows, rgb.step[0],
  9. QImage::Format_RGB888).copy();
  10. }
  11. case CV_8UC1: { // 灰度图格式
  12. return QImage((const uchar*)mat.data, mat.cols, mat.rows,
  13. mat.step[0], QImage::Format_Grayscale8).copy();
  14. }
  15. case CV_8UC4: { // BGRA 格式,需转换为 RGBA 格式
  16. cv::Mat rgba;
  17. cvtColor(mat, rgba, cv::COLOR_BGRA2RGBA);
  18. return QImage((const uchar*)rgba.data, rgba.cols, rgba.rows,
  19. rgba.step[0], QImage::Format_RGBA8888).copy();
  20. }
  21. default:
  22. qWarning("Unsupported Mat type.");
  23. return QImage();
  24. }
  25. }

使用方法

你可以按照以下方式使用这些函数:

  1. // 从文件加载图像到QImage中并转换为cv::Mat:
  2. QImage qImg("path/to/your/image.png");
  3. cv::Mat cvImg = QImageToCvMat(qImg);
  4. // 对cvImg进行操作...
  5. // 将处理后的cv::Mat转换回QImage:
  6. QImage resultImg = CvMatToQImage(cvImg);
  7. // 保存结果:
  8. resultImg.save("path/to/save/result_image.png");

注意事项

  • 在上述代码中,我们使用了 clone() 方法以确保从 QPixmap 中创建新的数据副本,这样当源对象销毁时不会影响生成的图像。
  • 还要根据你的实际应用情况选择适当的颜色空间,并相应地转换颜色顺序(如 BGR 到 RGB)。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?