OpenCV: Разница между матрицей с 1 столбцом типа 8UC3 и 3 столбцами типа 8UC1

#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