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

OpenCV的一个BUG: BMP读取后无法用imwrite成功保存PNG

 现象:

Opencv读取一个BMP文件,resize成功后想保存成png。发现结果只有一片黑色,啥也没有,仔细看了下代码,也没发现什么问题;各个环节用imshow检查了一遍,也找不到问题。查了一下,stackoverflow上也有人有同样的问题,

c++ - Saving an image with imwrite in opencv writes all black but imshow shows correctly - Stack Overflow

不过很可惜,上面给出的解决方案是错误的,因为convertTo并不能改变通道数目,只能改变depth(数据类型),也就是下面这些参数

#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6
#define CV_USRTYPE1 7

 因此,正确的做法是使用cv::cvtColor,把alpha通道消除掉,然后再用imwrite保存,我把大致我用的源码贴在下面。

        int cv_debug = 1;
        cv::Mat img = cv::imread(fstr.c_str(), cv::IMREAD_UNCHANGED);
		ich = img.channels();
		wd = img.size().width;
		ht = img.size().height;
		if (img.empty() || (wd <= 0) || (ht <= 0)) {
            return; //continue if in for loop;
		}
		wRatio = (double)wd / maxWidth;
		hRatio = (double)ht / maxHeight;

		ratio = max(wRatio, hRatio);
		scale = 1 / ratio;

		cv::Mat result, result3c;

		if (bKeepRatio) {
			cv::resize(img, result, cv::Size(), scale, scale, ipf);			
		}
		else {
			cv::resize(img, result, cv::Size(maxWidth, maxHeight), 0, 0, ipf);
		}

        cv::cvtColor(result, result3c, cv::COLOR_BGRA2BGR);

		if (cv_debug) {
			cv::imshow("image", img);
			cv::imshow("result", result);
			cv::imshow("result3c", result3c);
			cv::waitKey();
		}

		ich = result3c.channels();
		cv::imwrite(dstr, result3c);

这样的话,就能成功保存了。

仔细检查 result.channels()是4,result3c.channels()是3,至于为什么cv::imwrite不能成功保存result这个结果,我也没有仔细对源码进行调试。

相关文章:

  • 承接机器视觉项目到底应该选哪个解决方案?传统机器视觉 vs 人工智能
  • 安装OpenPCDet碰到的问题
  • Python3.8上安装vtk和mayavi踩坑: Building wheel for mayavi (setup.py) ...
  • ubuntu中如何显示或隐藏配置文件夹如.config
  • vscode没法选python解释器interpreter
  • 在windows10上安装运行ROS2
  • Ubuntu18.04 安装 ros2 foxy
  • VSCode常用操作
  • Ceres-Solver安装与简介
  • SLAM算法VINS-MONO安装运行介绍
  • Protobuf,gmock,gtest在windows10上的编译与安装
  • CMD闪退的问题及报错“点的大小应介于5和72之间”
  • 常用git 指令
  • 常用的anaconda(conda)命令
  • pcl_viewer的使用与viewer窗口编程
  • [LeetCode] Wiggle Sort
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 30秒的PHP代码片段(1)数组 - Array
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Babel配置的不完全指南
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript类型识别
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • magento 货币换算
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-redux的原理以及使用
  • Sass Day-01
  • 测试如何在敏捷团队中工作?
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 规范化安全开发 KOA 手脚架
  • 机器学习中为什么要做归一化normalization
  • 软件开发学习的5大技巧,你知道吗?
  • 我这样减少了26.5M Java内存!
  • 小程序 setData 学问多
  • 用quicker-worker.js轻松跑一个大数据遍历
  • C# - 为值类型重定义相等性
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #define与typedef区别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (8)STL算法之替换
  • (arch)linux 转换文件编码格式
  • (C++)八皇后问题
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)setTimeout 和 setInterval 的区别
  • (转载)Linux 多线程条件变量同步
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法