【发布时间】:2012-09-02 20:18:04
【问题描述】:
在 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) 会将 ones 放入通道 0,但通道 1 和 2 包含 zeros。 那么,如何将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。
附:在发布这个之前我做了很多搜索。我无法通过搜索“[opencv] Mat::ones”或“[opencv] +mat +ones”来解决此问题。
【问题讨论】:
-
旁注:对于 1 通道图像像素,我不确定是否应该使用
uchar代替cv::Vec3b。 OpenCV 提供了很多 2 项、3 项和 4 项向量类,但无法类比单例。 (在本页搜索Vec3b:opencv.willowgarage.com/documentation/cpp/…)
标签: c++ image image-processing opencv matrix