Насколько это безопасно манипулировать внутренним буфером cv :: Mat? - PullRequest
0 голосов
/ 13 марта 2012

Мне нужно создать cv :: Mat из буфера, но я не хочу, чтобы данные распределялись, поэтому я не могу использовать конструктор Mat (высота, ширина, тип, данные):

int data[100];
cv::Mat m;
m.create(10, 10, CV_32SC1); // allocate own buffer for m
for (size_t i = 0; i < 100; ++i)
{
    reinterpret_cast<int*>(m.data)[i] = data[i];
}

Мне нужно привести внутренний буфер (который всегда uchar *), чтобы иметь возможность напрямую копировать данные моего желаемого типа (в данном случае int), и это похоже на работу. Однако я напоминаю, что документы предпочитали метод выполнения всех операций с использованием uchar *, то есть приведение исходного буфера к uchar * и использование параметра stepWidth для получения правильного смещения в uchar * -единицах. Попаду ли я в неприятности, если сделаю это наоборот, или буфер Mat типа CV_32SC1 просто буфер int, и это не имеет значения?

1 Ответ

1 голос
/ 13 марта 2012

Да, внутренние буферы cv :: Mat - это просто блок данных - делайте с ними, как хотите (только не освобождайте их!)

Единственная сложность для многомерных массивов (таких какизображения) состоит в том, что каждая новая строка не обязательно следует непосредственно от конца последней строки.Строки дополняются, поэтому они всегда начинаются с 32-битной (64-битной для 64-битных сборок ??) границы - поэтому вам нужно использовать данные (строки).

В * 1005 есть тема о «внешних данных»* cv :: Mat документы

...