B样条拟合通常把离散点集作为控制点来求拟合曲线,原理和过程可参看https://blog.csdn.net/cnmgbmsdn/article/details/108141194。
如果想要求得过离散点的插值曲线,需要先用离散点反求控制点,然后用求得的控制点拟合曲线。原理在这篇文章中介绍较详细http://www.doc88.com/p-5714423317458.html
如图,P是控制点,V是离散点,左侧参数矩阵的逆矩阵乘以V矩阵就能得到P矩阵。c++代码如下:
/*
通过离散点集反求控制点
*/
vector<Point2f> BSplineInterpolate(vector<Point2f> discretePoints) {
int N = discretePoints.size();
Mat weight = Mat::zeros(Size(N,N), CV_32F);
for (int i = 0; i < weight.rows; i++) {
weight.ptr<float>(i)[i] = 1;
weight.ptr<float>(i)[(i+1)%weight.cols] = 4;
weight.ptr<float>(i)[(i+2)%weight.cols] = 1