OpenCV cv::Mat 'ones' для многоканальной матрицы?
При работе с 1-канальным (например, CV_8UC1
) Мат объектов в OpenCV, это создает Мат всех: cv::Mat img = cv::Mat::ones(x,y,CV_8UC1)
,
Тем не менее, когда я использую 3-канальные изображения (например, CV_8UC3
), все становится немного сложнее. дела cv::Mat img = cv::Mat::ones(x,y,CV_8UC3)
помещает единицы в канал 0, но каналы 1 и 2 содержат нули. Итак, как мне использовать 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 Я сделал много поисков, прежде чем опубликовать это. Я не смог решить эту проблему, выполнив поиск SO для "[opencv] Mat::ones" или "[opencv] +mat +ones".
2 ответа
Я не использую OpenCV, но я верю, что знаю, что здесь происходит. Вы определяете тип данных, но запрашиваете значение "1" для этого. Mat
Класс, по-видимому, не обращает внимания на тот факт, что у вас многоканальный тип данных, поэтому он просто преобразует '1' в 3-байтовый беззнаковый символ.
Таким образом, вместо использования ones
функция, просто используйте скалярный конструктор:
cv::Mat img_C3( x, y, CV_8UC3, CV_RGB(1,1,1) );
Вы также можете инициализировать так:
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));