Традиционно, при обработке изображения интерполяция выполняется по значению пикселя.В моем случае мне нужно сгенерировать переназначение (на ПК) для помещения во встроенную систему с камерой для дальнейшей обработки, чтобы любые алгоритмы обработки могли напрямую ссылаться на переназначение вместо того, чтобы обрабатывать каждый кадр заранее.Вот так (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;
}
}
}