OpenCV cv :: Mat 'ones' para matriz multicanal?
Ao trabalhar com 1 canal (por ex.CV_8UC1
Mat objetos no OpenCV, isso cria um Mat de todos os:cv::Mat img = cv::Mat::ones(x,y,CV_8UC1)
.
No entanto, quando eu uso imagens de 3 canais (por exemplo,CV_8UC3
), as coisas ficam um pouco mais complicadas. Fazendocv::Mat img = cv::Mat::ones(x,y,CV_8UC3)
colocauns no canal 0, mas os canais 1 e 2 contêmzeros. Então, como eu usocv::Mat::ones()
para imagens multi-canal?
Aqui está um código que pode ajudá-lo a ver o que quero dizer:
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
}
Então, eu esperava ver essa impressão:px of 3-channel img: 1 1 1
, mas ao invés disso eu vejo isso:px of 3-channel img: 1 0 0
.
P.S. Eu fiz muita pesquisa antes de postar isso. Eu não consegui resolver isso pesquisando SO para "[opencv] Mat :: ones" ou "[opencv] + mat + ones".