【问题标题】:remap irregular to regular grid将不规则网格重新映射到规则网格
【发布时间】:2013-08-26 13:27:35
【问题描述】:

我正在使用 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 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;
       }
   }
}

【问题讨论】:

    标签: opencv grid remap


    【解决方案1】:

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

    【讨论】:

    • 谢谢安德烈,我用其他一些错误改变了这一点,但你能告诉我通过使用 remap 来解决我的问题是否走在正确的轨道上吗?
    • 您需要将源图像上的每个点映射到目标点。我记得 remap 做了分配: Idst(map_y(i,j),map_x(i,j))=Isrc(i,j);如果它是你想要的,那么你以正确的方式。有时,使用从 dst 到 src 的逆映射更有效,即逐点扫描 dst 图像并评估 src 图像中的坐标,从中获取要在 src 图像中设置的值。此方法可让您避免 dst 图像上未填充的点。但是 remap 做插值,所以你不必担心它。但无论如何,您需要填写 map_x 和 map_y 矩阵中的所有元素,不要错过。
    • Andrey,我更正了上面的代码,它现在运行没有任何崩溃,但不幸的是结果似乎不正确。 map_x(160x160) 中的每一行从 -5 到 5(步长为 1/160)开始,map_y(160x160) 中的每一列从 -5 t0 5(步长为 1/160)开始。
    • 哦,我忘了你要使用不规则网格!好的,我认为处理它的最简单方法是使用重心插值。您只需要对不规则点进行三角测量,然后使用重心插值。看看:classes.soe.ucsc.edu/cmps160/Fall10/resources/…
    • Andrey,这是否意味着 remap 无法将不规则网格作为源处理并将其映射到规则网格?我实际上是在尝试在 Matlab 中找到 griddata 函数的等价物。在互联网上,我发现 OpenCV 中的这个重映射函数可以通过双三次插值来做到这一点。
    猜你喜欢
    • 2014-03-08
    • 2017-01-21
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2021-11-17
    • 2021-12-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多