Создание 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)
чтобы получить указатель на начало каждой строки, а затем цикл по строке.