Инициализировать многоканальный мат OpenCV - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно инициализировать многоканальную матрицу OpenCV.Я создаю многоканальную матрицу, подобную этой:

cv::Mat A(img.size(), CV_16SC(levels));

, где levels - это число каналов в матрице, которое может быть где угодно от 20 до 300. Я не могу инициализировать эту матрицу, кроме нуля.

Если я инициализирую матрицу следующим образом

cv::Mat A(img.size(), CV_16SC(levels), Scalar(1000));

Я получаю сообщение об ошибке "Утверждение не выполнено (cn <= 4) в cv :: scalarToRawData".Кажется, что мы можем инициализировать значения только до 4 каналов </p>

Есть ли какой-либо другой метод, доступный в OpenCV для инициализации этой многоканальной матрицы, или я должен вручную инициализировать значения?

Редактировать:Я сделал следующее, чтобы инициализировать эту многоканальную матрицу.Надеюсь, что это поможет тем, кто сталкивается с той же проблемой

for (int j = 0; j < img.rows; ++j) for (int i = 0; i < img.cols; ++i)
{
    short *p = A.ptr<short>(j) +(short)i*levels;
    for (int l = 0; l < levels; ++l)
    {
        p[l] = 1000;
    }
}

1 Ответ

0 голосов
/ 26 апреля 2019

Я пытался использовать шаблоны классов Vec_ и Mat_ OpenCV из-за этого конструктора Mat_.К сожалению, я не смог найти рабочее решение.Все попытки приводят к одной и той же ошибке, с которой вы уже сталкивались.Поэтому, я думаю, базовая реализация OpenCV просто не поддерживает такие действия даже для пользовательских производных типов.

Конечно, у вас есть своя идея обойти это.Тем не менее, я хотел предложить самое короткое (и, надеюсь, наиболее эффективное) решение, о котором я мог подумать:

const int levels = 20;
const cv::Size size = cv::Size(123, 234);

const cv::Mat proto = cv::Mat(size, CV_16SC1, 1000);

std::vector<cv::Mat> channels;
for (int i = 0; i < levels; i++)
    channels.push_back(proto);

cv::Mat A;
cv::merge(channels, A);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...