LensFun и OpenCV: ApplySubpixelGeometryDistortion - PullRequest
0 голосов
/ 07 февраля 2020

Я не могу на всю жизнь понять, как применять TCA- и коррекцию искажений, используя LensFun и OpenCV вместе.

LensFun - это база данных Open-Source-Lens-Database, содержащая параметры, которые можно применять к RAW-изображениям для исправления искажающих артефактов, возникающих при работе с RAW-данными.

В документации есть пример , в котором объясняется, как применять различные типы исправлений. Я особенно заинтересован в использовании ApplySubpixelGeometryDistortion (документация здесь ), как говорится в заголовке. Функция считывает одну строку данных пикселей (по крайней мере, в примере; в строке 297 ) и записывает неискаженные данные в массив. Функция будет вызываться для каждой строки в изображении, а затем для каждого столбца (т. Е. Координаты x), результирующие неискаженные значения пикселей могут быть записаны в новый массив изображений .

I искал inte rnet и нашел это сообщение из списка рассылки . Я попытался приспособить то, что оригинальный плакат обнаружил к моей проблеме, которая в настоящее время выглядит следующим образом:

auto *mod = new lfModifier(lens, lens->MinFocal, cam->CropFactor, Img.cols, Img.rows, LF_PF_U8);
if (!mod) {
    printf("Warning: Failed to create modifier!\n");
    delete img;
    delete ldb;
    return -1;
}

mod->EnableTCACorrection();
mod->EnableDistortionCorrection();

unsigned height = Img.rows;
unsigned width = Img.cols;

unsigned lwidth = width * 2 * 3;
auto *pos = new float[lwidth];
bool ok = true;

cv::Mat mapX(height, width, CV_32FC1);
cv::Mat mapY(height, width, CV_32FC1);

for (unsigned y = 0; y < height; y++) {
    ok = mod->ApplySubpixelGeometryDistortion(0.0, y, width, 1, pos);
    if (ok) {
        float *src = pos;
        for (unsigned x = 0; x < width; x++) {
            mapX.at<float>(y, x) = src[0];
            mapY.at<float>(y, x) = src[1];
            src += 2;
        }
    }
}

delete [] pos;

cv::Mat dest(height, width, CV_8UC3);
cv::remap(Img, dest, mapX, mapY, cv::INTER_NEAREST);
cv::imwrite("Corrected.png", dest);

Где Img - это cv::Mat. Полученное изображение Corrected.png выглядит следующим образом:

Image with distortion corrections applied

В то время как исходное искаженное изображение выглядит следующим образом (это всего лишь cv::imwrite после изображения RAW был распакован с помощью LibRaw):

Distorted image

Как вы можете видеть, по крайней мере виньетка исчезла, но поскольку все изображение является лишь вырезом оригинальное изображение это не такой сюрприз. Кроме того, искажения TCA не исчезли, так что я думаю, что что-то совершенно не так. Я действительно не знаю, чего я не понял или как я могу применить правильную коррекцию искажения.

Вся помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...