OpenCV cv:: мат 'ones' для многоканальной матрицы?

при работе с 1-канала (например,CV_8UC1) объекты Mat в OpenCV, это создает мат из всех: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 содержат нули. Итак, как мне использовать 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.

P. S. Я сделал много поиск, прежде чем отправлять это. Я не смог решить эту проблему, выполнив поиск "[opencv] Mat::ones" или "[opencv] +mat +ones".

2 ответов


Я не использую OpenCV, но я думаю, что знаю, что здесь происходит. Вы определяете тип данных, но для этого запрашиваете значение "1". The 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));