как получить доступ к n-му каналу мата в opencv?

Я знаю, как получить доступ к трем каналам cv::Mat с помощью Vec3b, Но теперь у меня есть n канал cv::Mat а также n не является постоянным (использовать cv::Vec<uchar, n>). Как я могу получить доступ cv::Mat каналы сейчас?

3

Решение

Скажем n = 10 и мы хотим получить доступ 4th канал пикселя (i, j), Вот простой пример:

typedef cv::Vec<uchar, 10> Vec10b;

// ....

// Create the mat
cv::Mat_<Vec10b> some_mat;

// Access 4th channel
uchar value = some_mat.at<Vec10b>(i,j)(4);

// or
uchar value = some_mat.at<Vec10b>(i,j)[4];

Надеюсь, это поможет вам. Обратите внимание, что вы можете опустить typedef линия, я просто думаю, что так проще.

2

Другие решения

Чтобы иметь возможность обрабатывать произвольное количество каналов, вы можете использовать cv::Mat::ptr и некоторая арифметика указателей.

Например, простой подход, который поддерживает только CV_8U Тип данных будет следующим:

#include <opencv2/opencv.hpp>
#include <cstdint>
#include <iostream>

inline uint8_t get_value(cv::Mat const& img, int32_t row, int32_t col, int32_t channel)
{
CV_DbgAssert(channel < img.channels());
uint8_t const* pixel_ptr(img.ptr(row, col));
uint8_t const* value_ptr(pixel_ptr + channel);
return *value_ptr;
}

void test(uint32_t channel_count)
{
cv::Mat img(128, 128, CV_8UC(channel_count));
cv::randu(img, 0, 256);

for (int32_t i(0); i < img.channels(); ++i) {
std::cout << i << ":" << get_value(img, 32, 32, i) << "\n";
}
}

int main()
{
for (uint32_t i(1); i < 10; ++i) {
test(i);
}

return 0;
}
0