предположим, что у меня есть
vector<unsigned char>a
которая представляет собой растровую информацию геотифового изображения, извлеченного RasterIO
функция библиотеки GDAL (библиотека с открытым исходным кодом для географических информационных систем)
мое изображение размером 7697×7309, поэтому вектор насчитывает 56257373 члена.
Как я могу применить фильтр Гаусса 5×5 к этому вектору, а затем получить результат в виде другого вектора-члена 56257373 типа unsigned char, чтобы иметь возможность сохранить вектор как другое изображение геотифа, используя библиотеку GDAL.
Мой главный вопрос — выше, но если это невозможно, скажите мне, есть ли у меня файл геотайфа, как я могу применить к нему фильтры, используя opencv во время выполнения. Я имею в виду, что я не хочу преобразовывать формат в другой, такой как растровое изображение и tiff на жестком диске, а затем считывать данные из трудно применяемых процессов, предположим, что у меня есть данные в формате GDAL в одной части памяти и я хочу преобразовать его в opencv совместимые данные в другой части и применить к нему фильтры?
Я думаю, это то, что вы просите:
// 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;
Проще чем вектор< > способ конвертации растровых данных 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 соответствуют размеру растра