在使用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
}
所以,我本来期望看到这样的输出:3通道图片的像素值:1 1 1
,但实际上我看到了这个:3通道图片的像素值:1 0 0
。
附言:在发布帖子之前,我进行了大量搜索。但是通过搜索“[opencv] Mat::ones”或“[opencv] +mat +ones”无法解决这个问题。
uchar
代替cv :: Vec3b
。 OpenCV提供了许多2、3和4项向量类,但没有单例的类比。 (在此页面上搜索“Vec3b”:http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#vec) - solvingPuzzles