Создание OpenCV Mat из пользовательских данных приводит к изображению с круговыми смещенными столбцами

У меня есть изображение, которое я загружаю из файла. Это.png. Я конвертирую это в одномерный массив для использования в функции через указатель на массив. Когда я создаю Mat из 1D указателя, получающееся изображение выглядит так, как будто оно занимает самые правые дюжины или около того столбцов и помещает их в левую часть изображения, почти как круговое смещение столбцов.

// SAMPLE CODE
Mat img  = imread(argv[1], CV_LOAD_IMAGE_ANYDEPTH);     // 16U1 png
int ncols   = img.cols;
int nrows   = img.rows;

//--Create input array and pointer--
uint16_t rawImage[nrows*ncols];
uint16_t *rawImage_ptr = rawImage;

//Assign value to array
for (int i=0;i<(ncols*nrows);i++){
 *(rawImage_ptr+i) = img.at<uint16_t>(i);
}

// Create Mat from pointer
Mat image(nrows, ncols, CV_16UC1, &rawImage_ptr);

В результате "изображение" имеет некоторые из правых столбцов, обернутых влево. Есть идеи, что здесь происходит?

1 ответ

Изображения хранятся в opencv с каждой новой строкой, начинающейся с 32-битной границы.
Если число пикселов * размер пикселя не кратно 4, то каждая строка, если изображение будет дополнено.

Вы должны использовать cv::mat ptr(row) чтобы получить указатель на начало каждой строки, а затем цикл по строке.

Другие вопросы по тегам