算法

warning: Creating default object from empty value in /srv/www/blog.sqlitedeveloper.com/www/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc on line 34.

使用gsl做最小二乘法的非线性拟合

拟合的函数方程是
y=alpha*exp(-kappa*x);

拟合后能正确算出alpha和kappa的值,用gsl写这个玩意好啰嗦,用python的curve_fit10行代码就能搞定。

  1. type
  2. PFitData=^TFitData;
  3. TFitData=record
  4. t:Pdouble;
  5. y:Pdouble;
  6. n:Integer;
  7. end;
  8.  
  9. function market(alpha,kappa, t:double):double;
  10. begin
  11. result:=alpha*exp(-kappa*t);
  12. end;
  13.  
  14. function func_f(x: Pgsl_vector; params: Pointer; f: Pgsl_vector): Integer;cdecl;
  15. var
  16. data:PFitData;
  17. alpha:double;
  18. kappa:double;
  19. i:Integer;
  20. t,yi,y:double;
  21. begin
  22. data:= PFitData(params);
  23. alpha := gsl_vector_get(x, 0);

对点云数据做匹配合并

经典的算法是ICP(iterative closest point),利用最小二乘法做点群匹配,算出转换矩阵。

Opencv仿射和透射变换的坐标变换

OpenCV里面通过getAffineTransform或者findTransformECC获取变形矩阵的饿时候会得到一个2x3或者3x3的变形矩阵,分别对应仿射矩阵和透视矩阵.

变形的时候如果想要算出原始图像坐标到目标图像的坐标的时候,可以使用下面方法计算

  1. if (matrixSize == 3)
  2. {
  3. //计算透视变换坐标
  4. double w= warp_matrix.at<float>(2, 0)*orgX + warp_matrix.at<float>(2, 1)*orgY + warp_matrix.at<float>(2, 2);
  5.  
  6. targetX = (warp_matrix.at<float>(0, 0)*orgX + warp_matrix.at<float>(0, 1)*orgY + warp_matrix.at<float>(0, 2))/w;
  7. targetY = (warp_matrix.at<float>(1, 0)*orgX + warp_matrix.at<float>(1, 1)*orgY + warp_matrix.at<float>(1, 2))/w;
  8. }
  9. else {
  10. //计算仿射变换坐标

同步内容