When working with 1-channel (e.g. CV_8UC1
) Mat objects in OpenCV, this creates a Mat of all ones: cv::Mat img = cv::Mat::ones(x,y,CV_8UC1)
.
However, when I use 3-channel images (e.g. CV_8UC3
), things get a little more complicated. Doing cv::Mat img = cv::Mat::ones(x,y,CV_8UC3)
puts ones into channel 0, but channels 1 and 2 contain zeros. So, how do I use cv::Mat::ones()
for multi-channel images?
Here's some code that might help you to see what I mean:
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
}
So, I would have expected to see this printout: px of 3-channel img: 1 1 1
, but instead I see this: px of 3-channel img: 1 0 0
.
P.S. I did a lot of searching before posting this. I wasn't able to resolve this by searching SO for "[opencv] Mat::ones" or "[opencv] +mat +ones".
uchar
in place ofcv::Vec3b
for a 1-channel image pixel. OpenCV offers a lot of 2-, 3-, and 4-item vector classes, but no analogy for a singleton. (Search forVec3b
on this page: opencv.willowgarage.com/documentation/cpp/…) – solvingPuzzles