前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >震惊 | OpenCV的bug吗?我又发现了一个?

震惊 | OpenCV的bug吗?我又发现了一个?

作者头像
OpenCV学堂
发布2020-06-11 20:10:46
6330
发布2020-06-11 20:10:46
举报

大家好,最近我一直写东西,结果无意中我又有了新发现,这次主要是针对OpenCV中Mat对象的创建。常见的Mat对象创建方式主要包括几下几种:

代码语言:javascript
复制
// create Mat - 1
Mat m1(4, 4, CV_8UC1, Scalar(255));
std::cout << "m1:\n" << m1 << std::endl;
// create Mat - 2
Mat m2(Size(4, 4), CV_8UC3, Scalar(0, 0, 255));
std::cout << "m2:\n" << m2 << std::endl;
// create Mat - 3
Mat m3(Size(4, 4), CV_8UC3, Scalar::all(255));
std::cout << "m3:\n" << m3 << std::endl;
// create Matlab风格 - 4
Mat m4 = Mat::zeros(Size(4, 4), CV_8UC3);
std::cout << "m4:\n" << m4 << std::endl;
// create Matlab风格 - 5
Mat m5 = Mat::ones(Size(4, 4), CV_8UC3);
std::cout << "m5:\n" << m5 << std::endl;

以前我经常写的代码是:

代码语言:javascript
复制
// create Matlab风格 - 5
Mat m5 = Mat::ones(Size(4, 4), CV_8UC1);
std::cout << "m5:\n" << m5 << std::endl;

发现工作良好,全部初始化为1,那天我也不知道自己怎么想的,就想创建一个三通道全是1的:

代码语言:javascript
复制
// create Matlab风格 - 5
Mat m5 = Mat::ones(Size(4, 4), CV_8UC3);
std::cout << "m5:\n" << m5 << std::endl

结果就得到上面的图。三通道中只有1个通道被初始化为1,其它居然还是0,我觉得我要检查一下以前写的代码,我记得我写了很多这种创建方式。这个是不是OpenCV挖下的一个大坑啊!

最后,我是在OpenCV4.2版本上发现的,后来我又让别人也测试了一下,发现之前版本也是一样!我居然才发现!我晕!居然从来没有人写过这个,关注过这个!

后来我在官方的API文档上找到了这句话:

In case of multi-channels type, only the first channel will be initialized with 1's, the others will be set to 0's.

后记:我一直想被Mat::ones误导至今!绝知此事要躬行!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档