查看: 157|回复: 13|关注: 0

[已解决] 粒子群法解决图像配准,求旋转平移矩阵

[复制链接]

新手

12 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
本帖最后由 发的广泛地 于 2019-3-13 18:33 编辑

采用龚老师的《精通matlab最优化计算》的粒子群法解决图像配准,求旋转平移矩阵,出现如图错误,求大神帮帮忙解决,可以有偿,谢谢
  1. function E = fitness1(a,b,c,tx,ty,tz)
  2. syms a b c tx ty tz%%%%不知道定义这个对不对???前3个旋转矩阵参数,后三个平移矩阵参数
  3. %Q最近点,PP测量点,xcl等数据点太多,没全传
  4. Q=[-62.5420000000000,-16.2660000000000,368;-62.5950000000000,-16.2690000000000,368;-62.6390000000000,-16.2570000000000,368;-62.6780000000000,-16.2350000000000,368;-62.7100000000000,-16.2040000000000,368;-62.7360000000000,-16.1540000000000,368];
  5. xcl=[-62.5407000000000;-62.5957000000000;-62.6412000000000;-62.6814000000000;-62.7146000000000;-62.7428000000000];
  6. ycl=[-16.2755000000000;-16.2749000000000;-16.2625000000000;-16.2396000000000;-16.2079000000000;-16.1562000000000];
  7. zcl=[368.001000000000;368.004000000000;368.004000000000;368.003000000000;368.005000000000;368;368.002000000000];

  8. PP=[xcl(1:231),ycl(1:231),zcl(1:231)]';
  9. R=[cos(b).*cos(c),-cos(b).*sin(c),-sin(b);sin(a).*sin(b).*cos(c)+cos(a).*sin(c),-sin(a).*sin(b).*sin(c)+cos(a).*cos(c),-sin(a).*cos(b);-cos(a).*sin(b).*cos(c)+sin(a).*sin(c),cos(a).*sin(b).*sin(c)+sin(a).*cos(c),cos(a).*cos(b)];
  10. T=[tx,ty,tz]';
  11. E=0;
  12. for i=1:231
  13.   E=E+(norm(QQ(:,i)-R*PP(:,i)-T))^2;
  14. end
  15. ---------------------------------------------------------
  16. %%%%龚老师的粒子群算法
  17. function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
  18. format long;
  19. %------初始化种群的个体------------
  20. for i=1:N
  21.     for j=1:D
  22.         x(i,j)=randn;  %随机初始化位置
  23.         v(i,j)=randn;  %随机初始化速度
  24.     end
  25. end
  26. %------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
  27. for i=1:N
  28.     p(i)=fitness(x(i,:));
  29.     y(i,:)=x(i,:);
  30. end
  31. pg = x(N,:);             %Pg为全局最优
  32. for i=1:(N-1)
  33.     if fitness(x(i,:))<fitness(pg)
  34.         pg=x(i,:);
  35.     end
  36. end
  37. %------进入主要循环,按照公式依次迭代------------
  38. for t=1:M
  39.     for i=1:N
  40.         v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
  41.         x(i,:)=x(i,:)+v(i,:);
  42.         if fitness(x(i,:))<p(i)
  43.             p(i)=fitness(x(i,:));
  44.             y(i,:)=x(i,:);
  45.         end
  46.         if p(i)<fitness(pg)
  47.             pg=y(i,:);
  48.         end
  49.     end
  50.     Pbest(t)=fitness(pg);
  51. end
  52. xm = pg';
  53. fv = fitness(pg);



复制代码
[/code]
22222222222222222222.png
1111111111.png

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2019-3-13 18:24:31 | 显示全部楼层
按 提示的话,你可能没有 符号工具箱的 norm 函数。
可以改写为其他的。

新手

12 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2019-3-13 18:28:48 | 显示全部楼层
maple1314168 发表于 2019-3-13 18:24
按 提示的话,你可能没有 符号工具箱的 norm 函数。
可以改写为其他的。

我是按照最后那张图片的公式输入的,而且我验证过norm函数,在命令窗口算过,是存在的

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2019-3-13 18:43:45 | 显示全部楼层
发的广泛地 发表于 2019-3-13 18:28
我是按照最后那张图片的公式输入的,而且我验证过norm函数,在命令窗口算过,是存在的 ...

符号工具箱的 norm
不是矩阵的。

新手

12 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2019-3-13 19:01:34 | 显示全部楼层
本帖最后由 发的广泛地 于 2019-3-13 19:19 编辑
maple1314168 发表于 2019-3-13 18:43
符号工具箱的 norm
不是矩阵的。

我将norm函数换成点坐标之间的运算,软件一直在忙:L
  1. E=E+(QQ(1,i)-R(1,:)*PP(:,i)-T(1)).^2+(QQ(2,i)-R(2,:)*PP(:,i)-T(2)).^2+(QQ(3,i)-R(3,:)*PP(:,i)-T(3)).^2;
复制代码

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2019-3-13 19:19:05 | 显示全部楼层
发的广泛地 发表于 2019-3-13 19:01
我将norm函数换成点坐标之间的运算,软件一直在忙

你的目标函数,写的不好。
a b c tx ty tz本身是输入的参数,你为何还要在里面定义?

新手

12 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2019-3-13 19:22:08 | 显示全部楼层
maple1314168 发表于 2019-3-13 19:19
你的目标函数,写的不好。
a b c tx ty tz本身是输入的参数,你为何还要在里面定义?
...

按照您说的,去掉syms之后,出现错误
44444444444.png

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2019-3-13 19:25:59 | 显示全部楼层 |此回复为最佳答案
发的广泛地 发表于 2019-3-13 19:22
按照您说的,去掉syms之后,出现错误

function E = fitness1(x)
a=x(1);b=x(2);c=x(3);
tx=x(4);ty=x(5);tz=x(6);
......

新手

12 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2019-3-13 19:32:54 | 显示全部楼层
maple1314168 发表于 2019-3-13 19:25
function E = fitness1(x)
a=x(1);b=x(2);c=x(3);
tx=x(4);ty=x(5);tz=x(6);

结果出来啦,谢谢您,由衷的感谢
6+6666666.png

新手

12 麦片

财富积分


050


1

主题

8

帖子

0

最佳答案
 楼主| 发表于 2019-3-13 19:57:14 | 显示全部楼层
maple1314168 发表于 2019-3-13 19:25
function E = fitness1(x)
a=x(1);b=x(2);c=x(3);
tx=x(4);ty=x(5);tz=x(6);

大神,还有一个问题,我现在成功运行是 所有的数据都在函数内部;;如果我想利用global函数的话(也就是这些数据点在函数外部),怎么使用?我将三个测量点的xcl,ycl,zcl全都注释掉,利用GLOBAL函数,运行出错,但是我的工作区里是有这3个xcl等的数据的
888888888.png
77777777.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表