2
我使用重映射函数将不规则网格(650 xyz-坐标)映射到常规网格(160x160点从-5 .... 5步骤1/160),但我可以'似乎得到它的工作。顺便说一下,我使用的插值是双三次的。有人可以告诉我是否可以这样做吗?提前致谢。不规则重映射到常规网格
using namespace cv;
using namespace POINTS;
std::ofstream file;
Mat src(400,3,CV_32F);
Mat dst(160,160,CV_32F);
Mat map_x;
Mat map_y;
int ind = 0;
Mat matx(400, 1, CV_32F, &pointsx);
Mat maty(400, 1, CV_32F, &pointsy);
Mat matz(400, 1, CV_32F, &pointsz);
void matrixDump(const Mat* mat);
void createMatrix(Mat* mat);
int main()
{
hconcat(matx, maty, matx);
hconcat(matx, matz, src);
map_x.create(160,160, CV_32FC1);
map_y.create(160, 160, CV_32FC1);
createMatrix(&map_x);
createMatrix(&map_y);
Mat T = map_y.t();
remap(src, dst, map_x, T, CV_INTER_CUBIC, BORDER_CONSTANT, Scalar(0, 0, 0));
return 0;
}
void matrixDump(const Mat* mat)
{
file.open("interpolation.txt");
for(int i=0; i<mat->rows ; i++)
{
for(int j=0; j<mat->cols;j++)
{
file << mat->at<float>(i,j) << " " ;
}
}
file.close();
}
void createMatrix(Mat* mat)
{
for(int i=0; i<mat->rows; i++)
{
for(int j=0; j<mat->cols; j++)
{
float value = -1. + (j*2./(mat->rows-1));
mat->at<float>(i,j) = 5. * value;
}
}
}
谢谢安德烈,我改变了一些其他的错误,但你可以告诉我,如果我在正确的轨道上使用重新映射我的问题? – xyfix
您需要映射源图像上的每个点以指向目标。正如我记得重新映射不分配:Idst(map_y(i,j),map_x(i,j))= Isrc(i,j);如果你想要的话,那么你的方式是正确的。有时,从dst到src使用反向映射,即逐点扫描dst图像,并评估src图像中的坐标,从中获得要在src图像中设置的值的效果会更加有效。这种方法可以避免在dst图像上没有填充点。但重新做插值,所以你不用担心它。但无论如何,您需要填充map_x和map_y矩阵中的所有元素而不会错过。 –
Andrey,我纠正了上面的代码,它现在运行时没有任何崩溃,但不幸的是结果似乎不正确。 map_x(160x160)中的每一行从-5到5(步长为1/160),map_y(160x160)中的每一列都从-5 t0 5开始(步长为1/160)。 – xyfix