// 对空间曲线的每个维度应用高斯滤波器进行平滑
std::vector<DataExportPoint<double>> SmoothSpatialCurve(const std::vector<DataExportPoint<double>>& curve, int kernel_size, double sigma) {
std::vector<DataExportPoint<double>> smoothed_curve(curve.size()); // 创建一个新的存储平滑后曲线的空间
//cv::Mat1d 是 OpenCV 的模板类,其中的 1d 部分表示矩阵的维度为1,即一维矩阵。所以 cv::Mat1d 实际上是一个包含双精度浮点型数据的一维矩阵。
cv::Mat1d xData(curve.size(), 1);//创建一个curve.size()行,1列的矩阵
cv::Mat1d yData(curve.size(), 1);
cv::Mat1d zData(curve.size(), 1);
// 将三维数据转换为OpenCV矩阵格式
for (size_t i = 0; i < curve.size(); ++i) {
xData(i, 0) = curve[i].x_;
yData(i, 0) = curve[i].y_;
zData(i, 0) = curve[i].z_;
}
// 创建一个高斯核 sigma为高斯函数的标准差,控制了高斯分布的宽度 CV_64F: 指定生成的高斯核的数据类型为双精度浮点型(64 位浮点数)
cv::Mat1d gauss_kernel = cv::getGaussianKernel(kernel_size, sigma, CV_64F);
// 高斯滤波器(实际上是卷积)
cv::Mat1d newXData, newYData, newZData;//存储滤波后的数据
//对输入数据矩阵 xData,yData,zData 进行二维分离滤波操作, 利用了预先生成的高斯核 gauss_kernel 对数据进行水平和垂直方向的平滑处理
//-1 表示输出图像与输入图像具有相同的深度 gauss_kernel 分别为水平方向与垂直方向的滤波核
cv::sepFilter2D(xData, newXData, -1, gauss_kernel, gauss_kernel);
cv::sepFilter2D(yData, newYData, -1, gauss_kernel, gauss_kernel);
cv::sepFilter2D(zData, newZData, -1, gauss_kernel, gauss_kernel);
// 将平滑后的数据转换回结构体
for (size_t i = 0; i < curve.size(); ++i) {
smoothed_curve[i] = {newXData(i, 0), newYData(i, 0), newZData(i, 0)};
}
return smoothed_curve;
}
利用高斯滤波对曲线进行平滑处理
于 2024-03-19 15:31:10 首次发布