1

私はopencvに非常に慣れていません...私はopencvの2つの線形データ配列からの値の間で予測する必要があります.Wat私はそのためにやろうとしています...たとえば、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でこれを行うことができますか...助けてください..よろしくお願いします。

4

1 に答える 1

2

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;
}

この関数は、指定された 2 つのデータポイントに指定されたターゲット値を線形補間します。

一度にすべてのデータポイントを提供する matlab 関数のように使用する場合は、2 つの最近傍を選択する関数が必要です。このようなもの:

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;
}

私はこれを広範囲にテストしませんでした。そのため、いくつかのバグを修正する必要があるかもしれません。

于 2012-04-21T15:26:40.523 に答える