使用OpenCV Mat::ones( )来创建cMat格式的数据时,只有第一个通道的值是1,其他通道的值都是0。
今天在利用opencv Mat::ones()这个指令创建白色的三通道cMat格式的图像时出现问题,反复尝试了好几次都是显示蓝色的图像:
所使用的代码为:
cv::Mat max_image = cv::Mat::ones(cv::Size(100, 100), CV_8UC3) * 255;
从代码中可以看出我想创建一个大小为100*100的三通道全白的图像,然而在反复测试时都发现显示的是蓝色的图像,最终使用通道分解的方法,将max_image 的三个通道进行分离,并给另外两个通道附上和第一个通道一样的值。通道分离、赋值、再重组的代码如下:
cv::Mat max_image = cv::Mat::ones(cv::Size(100, 100), CV_8UC3) * 255;
std::vector<cv::Mat> channels;
cv::split(max_image, channels);
channels[1] = channels[0]; // 将蓝色通道的值复制到绿色通道上
channels[2] = channels[0]; // 将蓝色通道的值复制到红色通道上
cv::merge(channels, max_image);
经过以上操作之后就将max_image的蓝色通道的255的值全赋给另外两个通道,最终得到一个全白的图像了。
-----------------------------------------------总结线-------------------------------------------
出现这个错误主要是因为在使用python创建全1张量的时候是全维度的1,而opencv的cv::Mat::ones()这个函数创建的却只有第一个维度是1,这个坑需要注意。
PS:我在通道分离之前还尝试了另一种方法,创建全0的图像给它们加上255,但是显示的依旧是全蓝的图像:
cv::Mat max_image = cv::Mat::zeros(cv::Size(100, 100), CV_8UC3) + 255;
因此估计这个函数创建多维的cMat图像的时候是默认只有第一个维度的数据可以进行操作的(如上述代码中创建了全0的图像给它们加上255,但是只有第一个维度进行添加),所以最终导致显示的还是蓝色图像。
因篇幅问题不能全部显示,请点此查看更多更全内容