Как интерполировать координаты пикселя вместо значения пикселя? Это нужно для того, чтобы сгенерировать корректировку для камеры - PullRequest
0 голосов
/ 21 апреля 2019

Традиционно, при обработке изображения интерполяция выполняется по значению пикселя.В моем случае мне нужно сгенерировать переназначение (на ПК) для помещения во встроенную систему с камерой для дальнейшей обработки, чтобы любые алгоритмы обработки могли напрямую ссылаться на переназначение вместо того, чтобы обрабатывать каждый кадр заранее.Вот так (ofc не написано так в приложении, просто демонстрация):

struct Point { //A pixel on the image
    int x, y
} original, corrected;

//I want every entry in this remap to have a valid value
float remap[width][height][2] = ...; //Contains the new pixel coordinates of each pixel
//I want the processes in the embedded system to be able to do this with every pixel
//But now it is not possible as not every pixel has a corresponding mapX and mapY
corrected.x = remap[original.x][original.y][0]; //mapX
corrected.y = remap[original.x][original.y][1]; //mapY

Один из процессов для генерации переназначения - это коррекция радиальных искажений с использованием OpenCV.Поскольку OpenCV использует обратную карту dst(x, y) = src(mapX(x, y), mapY(x, y)), я снова перевернул ее так, что dst(mapX(x, y), mapY(x, y)) = src(x, y).Но затем некоторые x, y не имеют соответствующих mapX, mapY после исправления.

Мне нужно, чтобы каждый x, y имел соответствующий mapX, mapY, чтобы процессы во встроенной системе работали должным образом.Как я могу интерполировать координаты пикселя вместо значения пикселя?

До сих пор я пытался просто усреднить значения mapX, mapY в окружающей области, но это не сработало.

for (int i = 0; i < parameters.width * parameters.height; ++i) {
    if (!status[i]) { //If no corresponding mapX, mapY
        double avgX = 0, avgY = 0;
        int count = 0;
        for (int y = -5; y < 5; ++y) { //A square surrounding the pixel being interpolated
            for (int x = -5; x < 5; ++x) {
                int num = std::min(std::max(0, i + y * parameters.width + x), parameters.width * parameters.height);
                if (status[num]) { //If this pixel has a corresponding mapX, mapY
                    avgX += mapX[num];
                    avgY += mapY[num];
                    ++count;
                }
            }
        }
        //If at least 1 pixel in the surrounding area has a corresponding mapX, mapY
        if (avgX != 0 || avgY != 0) {
            avgX /= count;
            avgY /= count;
            mapX[i] = avgX;
            mapY[i] = avgY;
            status[i] = true;
        }
    }
}

1 Ответ

0 голосов
/ 21 апреля 2019

предупреждение возможно

 int num = std::min(std::max(0, i + y * parameters.width + x), parameters.width * parameters.height);

должно быть

int num = std::min(std::max(0, i + y * parameters.width + x), parameters.width * parameters.height - 1);

из-за for (int i = 0; i < parameters.width * parameters.height; ++i) (я имею в виду i < parameters.width * parameters.height вместо i <= parameters.width * parameters.height)


avgX и avgY изменяются, только если (status[num]) имеет значение true, некоторые записи status содержат true прежде чем сделать общее для ?

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