2013-08-23 150 views
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; 
     } 
    } 
} 

回答

0

map_x.create(160,160, CV_32FC1);是浮动,但是当你填写你使用mat.at<double>(i,j) = 5. * value;。我不知道它是否能解决您的问题,但应该纠正。

+0

谢谢安德烈,我改变了一些其他的错误,但你可以告诉我,如果我在正确的轨道上使用重新映射我的问题? – xyfix

+0

您需要映射源图像上的每个点以指向目标。正如我记得重新映射不分配:Idst(map_y(i,j),map_x(i,j))= Isrc(i,j);如果你想要的话,那么你的方式是正确的。有时,从dst到src使用反向映射,即逐点扫描dst图像,并评估src图像中的坐标,从中获得要在src图像中设置的值的效果会更加有效。这种方法可以避免在dst图像上没有填充点。但重新做插值,所以你不用担心它。但无论如何,您需要填充map_x和map_y矩阵中的所有元素而不会错过。 –

+0

Andrey,我纠正了上面的代码,它现在运行时没有任何崩溃,但不幸的是结果似乎不正确。 map_x(160x160)中的每一行从-5到5(步长为1/160),map_y(160x160)中的每一列都从-5 t0 5开始(步长为1/160)。 – xyfix