OpenCV的ptr,at 以及Mat Point等变量的声明的解析。

rows就是行数,对应OpenCV坐标系中的y坐标

cols就是列数,对应OpenCV坐标系中的x坐标;

1. Mat对象:

C++: Mat::Mat(int rows, int cols, int type)
C++: Mat::Mat(int rows, int cols, int type, const Scalar& s)
C++: Mat::Mat(Size size, int type)
C++: Mat::Mat(Size size, int type, const Scalar& s)

Mat类型由行列初始化的时候,先行数后列数,也就是先定y的长度再定x的长度;

2. 访问Mat中的某点像素:

ptr<uchar>(y,x)     //ptr访问是先y后x
at<uchar>(y,x)      //使用at访问也是先y后x

3. 其他类对象的声明:先x坐标后y坐标:

Size_(_Tp _width, _Tp _height);
Point_(_Tp _x, _Tp _y);
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);

以下是使用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`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值