OpenCV получает значение канала пиксела от изображения Mat
может быть, я не смотрю достаточно усердно, но все, кажется, хочет, чтобы я использовал массив. Таким образом, как получить значение канала для определенного пикселя для foo, если foo-это что-то вроде Mat foo = imread("bar.png")
?
3 ответов
предполагая, что тип CV_8UC3 вы бы сделали это:
for(int i = 0; i < foo.rows; i++)
{
for(int j = 0; j < foo.cols; j++)
{
Vec3b bgrPixel = foo.at<Vec3b>(i, j);
// do something with BGR values...
}
}
здесь является документацией для Vec3b. Надеюсь, это поможет! Кроме того, не забывайте, что OpenCV хранит вещи внутри как BGR не RGB.
EDIT:
По соображениям производительности можно использовать прямой доступ к буферу данных для обработки значений пикселей:
вот как вы могли бы пойти об этом:
uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;
for(int i = 0; i < foo.rows; i++)
{
for(int j = 0; j < foo.cols; j++)
{
bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B
bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G
bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R
// do something with BGR values...
}
}
или как вариант:
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;
for(int i = 0; i < foo.rows; i++)
{
uint8_t* rowPtr = foo.row(i);
for(int j = 0; j < foo.cols; j++)
{
bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
bgrPixel.val[2] = rowPtr[j*cn + 2]; // R
// do something with BGR values...
}
}
приведенный ниже код работает для меня, как для доступа, так и для изменения значения пикселя.
для доступа к значению канала пикселя:
for (int i = 0; i < image.cols; i++) {
for (int j = 0; j < image.rows; j++) {
Vec3b intensity = image.at<Vec3b>(j, i);
for(int k = 0; k < image.channels(); k++) {
uchar col = intensity.val[k];
}
}
}
для изменения значения пикселя канала:
uchar pixValue;
for (int i = 0; i < image.cols; i++) {
for (int j = 0; j < image.rows; j++) {
Vec3b &intensity = image.at<Vec3b>(j, i);
for(int k = 0; k < image.channels(); k++) {
// calculate pixValue
intensity.val[k] = pixValue;
}
}
}
`
источник : доступ к значению пиксела
массив пикселей хранится в атрибуте "data" cv::Mat. Предположим, что у нас есть матрица мат, где каждый пиксель имеет 3 байта (CV_8UC3).
для этого примера нарисуем красный пиксель в позиции 100x50.
Mat foo;
int x=100, y=50;
Решение 1:
создать макрос, функцию, которая получает пиксель из массива.
#define PIXEL(frame, W, x, y) (frame+(y)*3*(W)+(x)*3)
//...
unsigned char * p = PIXEL(foo.data, foo.rols, x, y);
p[0] = 0; // B
p[1] = 0; // G
p[2] = 255; // R
решение 2:
получить пиксель с помощью метода ptr.
unsigned char * p = foo.ptr(y, x); // Y first, X after
p[0] = 0; // B
p[1] = 0; // G
p[2] = 255; // R