opencv曲线拟合c++
时间: 2023-09-11 10:08:19 浏览: 136
c++曲线拟合
4星 · 用户满意度95%
以下是使用OpenCV进行曲线拟合的示例代码:
```
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 生成一组随机数据作为拟合的输入
Mat x(100, 1, CV_32FC1);
Mat y(100, 1, CV_32FC1);
randu(x, Scalar(0), Scalar(100));
randu(y, Scalar(0), Scalar(100));
// 进行多项式曲线拟合
Mat fitParams;
polyfit(x, y, fitParams, 2); // 二次多项式拟合
// 绘制拟合曲线
Mat plotX(200, 1, CV_32FC1);
Mat plotY(200, 1, CV_32FC1);
float* px = plotX.ptr<float>(0);
float* py = plotY.ptr<float>(0);
for (int i = 0; i < plotX.rows; i++)
{
px[i] = i;
py[i] = fitParams.at<float>(2)*px[i] * px[i] + fitParams.at<float>(1)*px[i] + fitParams.at<float>(0);
}
Mat plotImg(200, 200, CV_8UC3, Scalar(255, 255, 255));
for (int i = 0; i < x.rows; i++)
{
circle(plotImg, Point(x.at<float>(i), y.at<float>(i)), 2, Scalar(0, 0, 255), -1);
}
for (int i = 0; i < plotX.rows - 1; i++)
{
line(plotImg, Point(px[i], py[i]), Point(px[i + 1], py[i + 1]), Scalar(0, 255, 0), 2);
}
imshow("Curve Fitting", plotImg);
waitKey(0);
return 0;
}
```
上述代码中,首先随机生成了100个点作为拟合的输入,然后使用`polyfit`函数对这些点进行二次多项式曲线拟合,得到拟合曲线的系数。接着,生成了200个点用于绘制拟合曲线,并将拟合曲线绘制在图像上。最后,显示图像并等待按键响应。
需要注意的是,`polyfit`函数需要自己实现,可以参考以下代码:
```
void polyfit(const cv::Mat &src_x, const cv::Mat &src_y, cv::Mat &dst, int order)
{
CV_Assert(src_x.rows == src_y.rows && src_x.type() == CV_32FC1 && src_y.type() == CV_32FC1 && order >= 1);
int n = src_x.rows;
int m = order + 1;
cv::Mat X(n, m, CV_32FC1);
cv::Mat Y(n, 1, CV_32FC1);
cv::Mat X_t, X_inv, X_t_X_inv, X_t_Y;
float* px = src_x.ptr<float>(0);
float* py = src_y.ptr<float>(0);
float* pX = X.ptr<float>(0);
float* pY = Y.ptr<float>(0);
for (int i = 0; i < n; i++)
{
float xi = px[i];
float yi = py[i];
pY[i] = yi;
for (int j = 0; j < m; j++)
{
pX[i*m + j] = pow(xi, j);
}
}
cv::transpose(X, X_t);
cv::invert(X_t*X, X_inv);
X_t_X_inv = X_t*X_inv;
X_t_Y = X_t*Y;
dst = X_t_X_inv*X_t_Y;
}
```
`polyfit`函数的输入为两个`CV_32FC1`类型的矩阵,分别是自变量和因变量。其中,`order`参数指定了拟合多项式的最高次数。函数的输出为一个`CV_32FC1`类型的矩阵,包含了拟合多项式的系数。在函数内部,首先构造了一个`n×(order+1)`的矩阵`X`和一个`n×1`的向量`Y`,然后利用输入的自变量和因变量填充这两个矩阵。接着,计算矩阵`X`的转置`X_t`、逆矩阵`X_inv`、`X_t*X_inv`和`X_t*Y`,最后将系数矩阵`dst`设置为`X_t_X_inv*X_t_Y`。
阅读全文