gpt4 book ai didi

matlab - 是否有直接执行一维数据插值的函数(查表)

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:44 24 4
gpt4 key购买 nike

我是 opencv 的新手...我需要预测 opencv 中两个线性数据数组的值之间的值。我将为此做些什么......例如,我们在 matlab 中使用 interp1 函数。

tab =
1950 150.697
1960 179.323
1970 203.212
1980 226.505
1990 249.633
then the population in 1975, obtained by table lookup within the matrix tab, is

p = interp1(tab(:,1),tab(:,2),1975)
p =
214.8585

我们如何在 opencv 中执行此操作...请帮助我...提前致谢。

最佳答案

您可以尝试使用 OpenCV 中内置的回归函数。但是对于您似乎正在做的简单线性插值,自己编写可能更容易。

double interpolate(int x1, double y1, int x2, double y2, int targetX)
{
int diffX = x2 - x1;
double diffY = y2 - y1;
int diffTarget = targetX - x1;

return y1 + (diffTarget * diffY) / diffX;
}

此函数对给定两个给定数据点的目标值进行线性插值。

如果您想像 matlab 函数一样使用它,一次提供所有数据点,您需要一个函数来选择两个最近的邻居。像这样:

double interpolate(Mat X, Mat Y, int targetX)
{
Mat dist = abs(X-targetX);
double minVal, maxVal;
Point minLoc1, minLoc2, maxLoc;

// find the nearest neighbour
Mat mask = Mat::ones(X.rows, X.cols, CV_8UC1);
minMaxLoc(dist,&minVal, &maxVal, &minLoc1, &maxLoc, mask);

// mask out the nearest neighbour and search for the second nearest neighbour
mask.at<uchar>(minLoc1) = 0;
minMaxLoc(dist,&minVal, &maxVal, &minLoc2, &maxLoc, mask);

// use the two nearest neighbours to interpolate the target value
double res = interpolate(X.at<int>(minLoc1), Y.at<double>(minLoc1), X.at<int>(minLoc2), Y.at<double>(minLoc2), targetX);
return res;
}

下面是一个展示如何使用它的小例子:

int main()
{
printf("res = %f\n", interpolate(1970, 203.212, 1980, 226.505, 1975));

Mat X = (Mat_<int>(5, 1) <<
1950, 1960, 1970, 1980, 1990);
Mat Y = (Mat_<double>(5, 1) <<
150.697, 179.323, 203.212, 226.505, 249.633);
printf("res = %f\n", interpolate(X, Y, 1975));

return 0;
}

我没有对此进行广泛测试。因此,您可能需要修复一些错误。

关于matlab - 是否有直接执行一维数据插值的函数(查表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com