gpt4 book ai didi

c++ - OpenCV 中的矩阵值是 inf/nan

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:49 24 4
gpt4 key购买 nike

我正在尝试对一组点使用多项式回归将它们映射到一条曲线。当我构 build 计矩阵时,赋值似乎没有正确进行。构造的矩阵是一个 3 x n 矩阵,其中 n 是点数,与设计矩阵一样,第一列应该全为 1(来自 //HERE IS ASSIGNMENT 部分)。当我打印矩阵时,第一列充满了随机数,而且通常是 infs 和 nans。常量赋值怎么可能?这会导致对矩阵进行任何数学运算时出现更多问题,因为它充满了非数字和信息。

下面的代码是构建矩阵的地方。

for (auto it = lane_lines.begin(); it != lane_lines.end(); it++) {
vector<pair<Point, Point> > lines = *it;

// Remove random line clusters
if (lines.size() < 10) {
it = --lane_lines.erase(it);
continue;
}

Mat design(lines.size() * 2, 3, CV_64FC1);
Mat y_vec(lines.size() * 2, 1, CV_64FC1);

for (int i = 0; i < lines.size(); i += 2) {
// HERE IS ASSIGNMENT
design.at<double>(i * 2, 0) = 1.0;
design.at<double>(i * 2, 1) = lines[i].first.x;
design.at<double>(i * 2, 2) = pow(lines[i].first.x, 2);
design.at<double>(i * 2 + 1, 0) = 1.0;
design.at<double>(i * 2 + 1, 1) = lines[i].second.x;
design.at<double>(i * 2 + 1, 2) = pow(lines[i].second.x, 2);

y_vec.at<double>(i * 2, 0) = lines[i].first.y;
y_vec.at<double>(i * 2 + 1, 0) = lines[i].second.y;
}

// TODO: Deal with all the NaNs
cout << design << endl;
cout << design.t() * design << endl;
cout << "DET: " << determinant(design.t() * design) << endl << endl;

Mat std_poly = ((design.t() * design).inv() * design.t()) * y_vec;

double a = std_poly.at<double>(0, 2);
double b = std_poly.at<double>(0, 1);
double c = std_poly.at<double>(0, 0);
double h = -b / (2 * a == 0 ? numeric_limits<double>::min() : 2 * a);
double k = c - (a * pow(h, 2));

tuple<double, double, double, Point> curve(a, b, c, Point(h, k));
curves.push_back(curve);
}

编辑:对于不同的数据集,问题似乎是随机发生的。

最佳答案

首先看一下您的代码:

for (int i = 0; i < lines.size(); i += 2) {
// HERE IS ASSIGNMENT
design.at<double>(i * 2, 0) = 1.0;
design.at<double>(i * 2, 1) = lines[i].first.x;
design.at<double>(i * 2, 2) = pow(lines[i].first.x, 2);
design.at<double>(i * 2 + 1, 0) = 1.0;
design.at<double>(i * 2 + 1, 1) = lines[i].second.x;
design.at<double>(i * 2 + 1, 2) = pow(lines[i].second.x, 2);
y_vec.at<double>(i * 2, 0) = lines[i].first.y;
y_vec.at<double>(i * 2 + 1, 0) = lines[i].second.y;
}

对于第一次迭代 i=0 这两行

design.at<double>(i * 2, 0) = 1.0;
design.at<double>(i * 2 + 1, 0) = 1.0;

成为:

design.at<double>(0, 0) = 1.0;
design.at<double>(1, 0) = 1.0;

然后下一次迭代是 i=2 因为 i+=2 在循环中所以上面的行变成:

design.at<double>(4, 0) = 1.0;
design.at<double>(5, 0) = 1.0;

我认为您应该将 i+=2 更改为 i++ 以修复该行为。

注意您的代码可能还有其他问题。

关于c++ - OpenCV 中的矩阵值是 inf/nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49692515/

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