Как преобразовать извлеченную растровую информацию в формат, обрабатываемый библиотекой opencv

предположим, что у меня есть

vector<unsigned char>a  

который представляет собой растровую информацию изображения geotiff, извлеченную функцией RasterIO библиотеки GDAL (библиотека с открытым исходным кодом для географических информационных систем)
мое изображение имеет размер 7697x7309, поэтому вектор имеет 56257373 элемента.
Как я могу подать заявку фильтр Гаусса 5x5 для этого вектора, а затем получить результат в виде другого вектора из 56257373 элементов типа unsigned char, чтобы иметь возможность сохранить вектор как другое изображение геотифа с использованием библиотеки GDAL.


Мой главный вопрос выше, но если это невозможно, скажите мне, есть ли у меня файл geotiff, как я могу применить к нему фильтры, используя opencv во время выполнения. Я имею в виду, что я не хочу преобразовывать формат в другой, например, растровый и tiff на жестком диске, а затем читать данные с жесткого диска, чтобы применять к нему процессы, предположим, что у меня есть данные в формате GDAL в одной части памяти и я хочу преобразовать его в данные, совместимые с opencv, в другой части и применить к нему фильтры?


person Sepideh Abadpour    schedule 01.09.2013    source источник
comment
Подсказка: есть специализированный форум StackExchange по адресу gis.stackexchange.com.   -  person Christian Severin    schedule 25.06.2019


Ответы (2)


Я думаю, это то, о чем вы просите:

// 1. Convert vector to Mat

cv::Mat amat(7309, 7697, CV_8UC1, &a[0]);

// 2. Apply 5x5 Gaussian filter

cv::Mat bmat;  // blurred output, sigma=1.4 assumed below
cv::GaussianBlur(amat, bmat, cv::Size(5,5), 1.4); 

// 3. Convert Mat to vector

cv::Mat cmat = bmat.reshape(1, 1); // make the Mat one big long row
std::vector<unsigned char>b = cmat;
person Bull    schedule 01.09.2013

Более простой, чем вектор‹ > способ преобразования из GDAL в растровые данные OpenCV:

//Region of Interest to be read
cv::Rect roi(x, y, w, h);

//Mat allocation to store the data
cv::Mat mat;
mat.create(roi.size(),CV_32F);

//data is stored directly in the mat passing the mat.data pointer to RasterIO
band->RasterIO( GF_Read, roi.x, roi.y, roi.width, roi.height, mat.data,
                roi.width, roi.height, GDT_Float32, 0, 0);

Вам просто нужно убедиться, что тип данных OpenCV соответствует типу данных GDAL и что размеры ROI подходят для размера растра.

person Guillaume    schedule 23.06.2014