Opencv 将不规则栅格重新映射为规则栅格

Opencv 将不规则栅格重新映射为规则栅格,opencv,grid,remap,Opencv,Grid,Remap,我正在使用“重新映射”功能将不规则栅格(650 xyz坐标)映射到规则栅格(从-5…5步骤1/160到160x160点),但我似乎无法使其正常工作。顺便说一下,我使用的插值是双三次的。有人能告诉我这样做是否可行吗?提前谢谢 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

我正在使用“重新映射”功能将不规则栅格(650 xyz坐标)映射到规则栅格(从-5…5步骤1/160到160x160点),但我似乎无法使其正常工作。顺便说一下,我使用的插值是双三次的。有人能告诉我这样做是否可行吗?提前谢谢

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;
       }
   }
}
使用名称空间cv;
使用名称空间点;
流文件的std::of;
材料src(400,3,CV_32F);
材料dst(160160,CV_32F);
Mat-map_x;
Mat map_y;
int ind=0;
matx材料(400、1、CV_32F和pointsx);
材料(400、1、CV_32F和pointsy);
Mat matz(400、1、CV_32F和pointsz);
无效矩阵泵(常数矩阵*矩阵);
空隙率矩阵(Mat*Mat);
int main()
{
hconcat(matx,maty,matx);
hconcat(matx、matz、src);
创建地图(160160,CV_32FC1);
创建地图(160、160、CV_32FC1);
创建矩阵(&map_x);
创建矩阵(&map_y);
Mat T=map_y.T();
重映射(src,dst,map_x,T,CV_INTER_CUBIC,BORDER_常量,标量(0,0,0));
返回0;
}
无效矩阵泵(常数矩阵*矩阵)
{
打开(“interpolation.txt”);
for(int i=0;irows;i++)
{
for(int j=0;jcols;j++)
{
文件位于(i,j)行(第1行);
mat->at(i,j)=5.*值;
}
}
}

map\u x.create(160160,CV\u 32FC1)是浮动的,但当您填充它时,您使用
mat.at(i,j)=5。*价值观。我不知道它是否解决了您的问题,但它应该得到纠正。

谢谢Andrey,我用了一些其他错误更改了它,但是您能通过使用“重新映射”来判断我的问题是否正确吗?您需要将源图像上的每个点映射到目标上的点。我记得remap做的赋值是: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开始到5(步长为1/160)。不过,我忘了你想使用不规则网格!好的,我认为最简单的方法是使用重心插值。所有你需要的是三角化你的不规则点,然后使用重心插值。看看:Andrey,这是否意味着remap不能将不规则网格作为源处理并将其映射到规则网格?我实际上是想在Matlab中找到griddata函数的等价物。在互联网上,我发现OpenCV中的这个重映射函数可以通过双三次插值实现这一点。