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

2020-06-11 20:10:46 浏览数 (1)

大家好,最近我一直写东西,结果无意中我又有了新发现,这次主要是针对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误导至今!绝知此事要躬行!

0 人点赞