#opencv #matrix
#opencv #матрица
Вопрос:
Допустим, я создаю матрицу M1 из 5 строк и 1 столбца типа 8UC3 для хранения компонентов RGB изображения.Затем я создаю другую матрицу M2 из 5 строк и 3 столбцов типа 8UC1, чтобы снова сохранить компоненты RGB изображения.
Есть ли разница в способе хранения этих двух типов матриц в памяти / доступа к ним из памяти? Из того, что я понимаю из http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 (обычно рекомендуемое руководство OpenCV по Stackoverflow), указатель данных матрицы указывает на первый индекс массива данных (матрица хранится внутри в виде массива), а различные компоненты RGB хранятся переплетенным образом (в случае 8UC3).
Моя логика говорит, что они должны быть такими же, как в случае 1 столбца 8UC3 (M1), для каждого столбца хранятся компоненты RGB, а в случае 3 столбцов 8UC1 (M2) в каждом столбце хранится компонент RGB. Я надеюсь, что мне удалось правильно сформулировать свой вопрос.
Заранее спасибо!
Комментарии:
1. Что именно вы пытаетесь сделать с этими двумя матрицами? Просто потому, что указатель на данные может быть одинаковым, это не означает, что функции OpenCV будут обрабатывать их одинаково.
Ответ №1:
Ваше понимание правильное. Расположение памяти будет точно таким же. Таким образом, вы можете дешево преобразовать представление взад-вперед с помощью метода reshape.
Разница заключается в том, как алгоритмы OpenCV будут обрабатывать эти матрицы.
Допустим, объем памяти следующий:
255 0 0
255 0 0
255 0 0
255 0 0
255 0 0
И вы хотите вызвать функцию изменения размера, чтобы добавить 3 столбца. Тогда в случае матрицы размером 5×1 CV_8UC3 результатом будет
255 0 0 255 0 0
255 0 0 255 0 0
255 0 0 255 0 0
255 0 0 255 0 0
255 0 0 255 0 0
И в случае матрицы CV_8UC1 размером 5×3, результат будет
255 255 0 0 0 0
255 255 0 0 0 0
255 255 0 0 0 0
255 255 0 0 0 0
255 255 0 0 0 0