0001 function InsertLaserIntoImage( im, angleVector, rangeVector, delta, phi, f, c, k, alpha,deltae,rote,fe,ce,ke,alphae)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 rot=dcm2angvec(phi);
0044 phiinv=inv(phi);
0045
0046
0047
0048
0049 [zl,xl]=pol2cart(angleVector,rangeVector);
0050
0051 Lpts=[xl;zeros(size(xl));zl];
0052
0053
0054 Lpts=Lpts.*1000;
0055 delta=delta.*1000;
0056 deltae=deltae.*1000;
0057
0058
0059 Cpts=phiinv*Lpts+repmat(delta,1,size(Lpts,2));
0060
0061 xc=Cpts(1,:);
0062 yc=Cpts(2,:);
0063 zc=Cpts(3,:);
0064
0065
0066
0067 a=xc./zc;
0068 b=yc./zc;
0069
0070
0071
0072 r = sqrt(a.^2 + b.^2);
0073
0074 ad = a.*(1 + k(1).*r.^2 + k(2).*r.^4 + k(5).*r.^6) + 2.*k(3).*a.*b + k(4).*(r.^2 + 2.*a.^2);
0075 bd = b.*(1 + k(1).*r.^2 + k(2).*r.^4 + k(5).*r.^6) + k(3).*(r.^2 + 2.*b.^2) + 2.*k(4).*a.*b;
0076
0077
0078
0079 x = f(1).*(ad + alpha.*bd) + c(1) + 1;
0080 y = f(2).*bd + c(2) + 1;
0081
0082
0083
0084
0085
0086
0087
0088
0089 [phi,phix,phiy,phiz,dphix,dphiy,dphiz]=angvec2dcm(rot);
0090
0091
0092 dpcddeltax=repmat([1;0;0],1,size(Lpts,2));
0093 dpcddeltay=repmat([0;1;0],1,size(Lpts,2));
0094 dpcddeltaz=repmat([0;0;1],1,size(Lpts,2));
0095
0096
0097 dpcdrot1=-phiinv*(phiz*phiy*dphix)*phiinv*Lpts;
0098 dpcdrot2=-phiinv*(phiz*dphiy*phix)*phiinv*Lpts;
0099 dpcdrot3=-phiinv*(dphiz*phiy*phix)*phiinv*Lpts;
0100
0101 dxcddeltax=dpcddeltax(1,:);
0102 dycddeltax=dpcddeltax(2,:);
0103 dzcddeltax=dpcddeltax(3,:);
0104
0105 dxcddeltay=dpcddeltay(1,:);
0106 dycddeltay=dpcddeltay(2,:);
0107 dzcddeltay=dpcddeltay(3,:);
0108
0109 dxcddeltaz=dpcddeltaz(1,:);
0110 dycddeltaz=dpcddeltaz(2,:);
0111 dzcddeltaz=dpcddeltaz(3,:);
0112
0113 dxcdrot1=dpcdrot1(1,:);
0114 dycdrot1=dpcdrot1(2,:);
0115 dzcdrot1=dpcdrot1(3,:);
0116
0117 dxcdrot2=dpcdrot2(1,:);
0118 dycdrot2=dpcdrot2(2,:);
0119 dzcdrot2=dpcdrot2(3,:);
0120
0121 dxcdrot3=dpcdrot3(1,:);
0122 dycdrot3=dpcdrot3(2,:);
0123 dzcdrot3=dpcdrot3(3,:);
0124
0125
0126 dadxc=1./zc;
0127
0128 drdxc=a.*dadxc./r;
0129 daddxc=dadxc.*(1 + k(1).*r.^2 + k(2).*r.^4 + k(5).*r.^6)...
0130 +a.*(2.*k(1).*r.*drdxc + 4.*k(2).*r.^3.*drdxc + 6.*k(5).*r.^5.*drdxc)...
0131 +2.*k(3).*dadxc.*b +k(4).*(2.*r.*drdxc +4.*a.*dadxc);
0132 dbddxc=b.*(2.*k(1).*r.*drdxc + 4.*k(2).*r.^3.*drdxc + 6.*k(5).*r.^5.*drdxc)...
0133 +k(3).*2.*r.*drdxc +2.*k(4).*b.*dadxc;
0134
0135
0136
0137 dbdyc=1./zc;
0138 drdyc=b.*dbdyc./r;
0139 daddyc=a.*(2.*k(1).*r.*drdyc + 4.*k(2).*r.^3.*drdyc + 6.*k(5).*r.^5.*drdyc)...
0140 +2.*k(3).*a.*dbdyc +k(4).*2.*r.*drdyc;
0141 dbddyc=dbdyc.*(1 + k(1).*r.^2 + k(2).*r.^4 + k(5).*r.^6)...
0142 +b.*(2.*k(1).*r.*drdyc + 4.*k(2).*r.^3.*drdyc + 6.*k(5).*r.^5.*drdyc)...
0143 +k(3).*(2.*r.*drdyc+4.*b.*dbdyc) +2.*k(4).*a.*dbdyc;
0144
0145
0146 dadzc=-xc./(zc.^2);
0147 dbdzc=-yc./(zc.^2);
0148 drdzc=(a.*dadzc+b.*dbdzc)./r;
0149 daddzc=dadzc.*(1 + k(1).*r.^2 + k(2).*r.^4 + k(5).*r.^6)...
0150 +a.*(2.*k(1).*r.*drdzc + 4.*k(2).*r.^3.*drdzc + 6.*k(5).*r.^5.*drdzc)...
0151 +2.*k(3).*(a.*dbdzc + b.*dadzc) + k(4).*(2.*r.*drdzc+4.*a.*dadzc);
0152 dbddzc=dbdzc.*(1 + k(1).*r.^2 + k(2).*r.^4 + k(5).*r.^6)...
0153 +b.*(2.*k(1).*r.*drdzc + 4.*k(2).*r.^3.*drdzc + 6.*k(5).*r.^5.*drdzc)...
0154 +k(3).*(2.*r.*drdzc+4.*b.*dbdzc)+2.*k(4).*(a.*dbdzc+b.*dadzc);
0155
0156
0157
0158
0159 dxdxc=f(1).*(daddxc+alpha.*dbddxc);
0160 dxdyc=f(1).*(daddyc+alpha.*dbddyc);
0161 dxdzc=f(1).*(daddzc+alpha.*dbddzc);
0162
0163 dxddeltax=dxdxc.*dxcddeltax+dxdyc.*dycddeltax+dxdzc.*dzcddeltax;
0164 dxddeltay=dxdxc.*dxcddeltay+dxdyc.*dycddeltay+dxdzc.*dzcddeltay;
0165 dxddeltaz=dxdxc.*dxcddeltaz+dxdyc.*dycddeltaz+dxdzc.*dzcddeltaz;
0166
0167 dxdrot1=dxdxc.*dxcdrot1+dxdyc.*dycdrot1+dxdzc.*dzcdrot1;
0168 dxdrot2=dxdxc.*dxcdrot2+dxdyc.*dycdrot2+dxdzc.*dzcdrot2;
0169 dxdrot3=dxdxc.*dxcdrot3+dxdyc.*dycdrot3+dxdzc.*dzcdrot3;
0170
0171 dxdf1=ad.*alpha.*bd;
0172 dxdf2=zeros(size(ad));
0173 dxdc1=ones(size(ad));
0174 dxdc2=zeros(size(ad));
0175 dxdk1=f(1).*(a.*r.^2 + alpha.*b.*r.^2);
0176 dxdk2=f(1).*(a.*r.^4 + alpha.*b.*r.^4);
0177 dxdk3=f(1).*(2.*a.*b + alpha.*(r.^2+2.*b.^2));
0178 dxdk4=f(1).*(r.^2+2.*a.^2+alpha.*(2.*a.*b));
0179 dxdk5=f(1).*(a.*r.^6 + alpha.*(b.*r.^6));
0180 dxdalpha=f(1).*bd;
0181
0182 Jx=[dxddeltax',dxddeltay',dxddeltaz',dxdrot1',dxdrot2',dxdrot3',dxdf1',dxdf2',dxdc1',dxdc2',dxdk1',dxdk2',dxdk3',dxdk4',dxdk5',dxdalpha'];
0183
0184
0185
0186 dydxc=f(2).*dbddxc;
0187 dydyc=f(2).*dbddyc;
0188 dydzc=f(2).*dbddzc;
0189
0190 dyddeltax=dydxc.*dxcddeltax+dydyc.*dycddeltax+dydzc.*dzcddeltax;
0191 dyddeltay=dydxc.*dxcddeltay+dydyc.*dycddeltay+dydzc.*dzcddeltay;
0192 dyddeltaz=dydxc.*dxcddeltaz+dydyc.*dycddeltaz+dydzc.*dzcddeltaz;
0193
0194 dydrot1=dydxc.*dxcdrot1+dydyc.*dycdrot1+dydzc.*dzcdrot1;
0195 dydrot2=dydxc.*dxcdrot2+dydyc.*dycdrot2+dydzc.*dzcdrot2;
0196 dydrot3=dydxc.*dxcdrot3+dydyc.*dycdrot3+dydzc.*dzcdrot3;
0197
0198
0199 dydf1=zeros(size(bd));
0200 dydf2=bd;
0201 dydc1=zeros(size(bd));
0202 dydc2=ones(size(bd));
0203 dydk1=f(2).*b.*r.^2;
0204 dydk2=f(2).*b.*r.^4;
0205 dydk3=f(2).*(r.^2+2.*b.^2);
0206 dydk4=f(2).*(2.*a.*b);
0207 dydk5=f(2).*b.*r.^6;
0208 dydalpha=zeros(size(bd));
0209
0210 Jy=[dyddeltax',dyddeltay',dyddeltaz',dydrot1',dydrot2',dydrot3',dydf1',dydf2',dydc1',dydc2',dydk1',dydk2',dydk3',dydk4',dydk5',dydalpha'];
0211
0212
0213 Q=diag([deltae',rote',fe',ce',ke',alphae'].^2);
0214
0215
0216
0217
0218
0219
0220
0221 unx2=diag(Jx*Q*Jx');
0222 uny2=diag(Jy*Q*Jy');
0223
0224 errorx=sqrt(unx2)';
0225 errory=sqrt(uny2)';
0226
0227
0228
0229 validindices=find(x<=size(im,2) & x>0 & y<=size(im,1) & y>0);
0230
0231
0232 px=x(validindices);
0233 py=y(validindices);
0234 perrorx=errorx(validindices);
0235 perrory=errory(validindices);
0236
0237
0238
0239 figure;
0240 warning('off','Images:initSize:adjustingMag');
0241 imshow(im,[]);
0242 warning('on','Images:initSize:adjustingMag');
0243 hold on;
0244 c=lines(length(px));
0245 scatter(px,py,[],c,'+');
0246 nspdpts=20;
0247 c=repmat(c,nspdpts,1);
0248
0249
0250
0251
0252 ellipse(2.*perrorx,2.*perrory,zeros(size(x)),px,py,c);
0253
0254
0255