12

在 OpenCV 中使用 1 通道(例如CV_8UC1)Mat 对象时,这会创建一个全为 1 的 Mat cv::Mat img = cv::Mat::ones(x,y,CV_8UC1):.

然而,当我使用 3 通道图像(例如CV_8UC3)时,事情变得有点复杂。cv::Mat img = cv::Mat::ones(x,y,CV_8UC3)1放入通道 0,但通道 1 和 2 包含0那么,如何使用cv::Mat::ones()多通道图像呢?

这里有一些代码可以帮助你理解我的意思:

void testOnes() {
 int x=2; int y=2; //arbitrary

 // 1 channel
 cv::Mat img_C1 = cv::Mat::ones(x,y,CV_8UC1);
 uchar px1 = img_C1.at<uchar>(0,0); //not sure of correct data type for px in 1-channel img
 printf("px of 1-channel img: %d \n", (int)px1); //prints 1

 // 3 channels
 cv::Mat img_C3 = cv::Mat::ones(x,y,CV_8UC3); //note 8UC3 instead of 8UC1
 cv::Vec3b px3 = img_C3.at<cv::Vec3b>(0,0);
 printf("px of 3-channel img: %d %d %d \n", (int)px3[0], (int)px3[1], (int)px3[2]); //prints 1 0 0
}

所以,我本来希望看到这个打印输出:px of 3-channel img: 1 1 1,但我看到的是这个:px of 3-channel img: 1 0 0

PS 在发布之前我做了很多搜索。我无法通过搜索“[opencv] Mat::ones”或“[opencv] +mat +ones”来解决这个问题。

4

2 回答 2

9

我不使用 OpenCV,但我相信我知道这里发生了什么。您定义了一个数据类型,但您为此请求值“1”。该类Mat似乎没有注意到您拥有多通道数据类型这一事实,因此它只是将“1”转换为 3 字节无符号字符。

因此,不要使用ones函数,只需使用标量构造函数:

cv::Mat img_C3( x, y, CV_8UC3, CV_RGB(1,1,1) );
于 2012-09-10T00:37:01.493 回答
2

你也可以这样初始化:

Mat img;

/// Lots of stuff here ...

// Need to initialize again for some reason:
img = Mat::Mat(Size(width, height), CV_8UC3, CV_RGB(255,255,255));
于 2013-11-28T18:10:47.727 回答