從年前就開始編寫乙個標定的程式,可是總是在不小心程式改動一點,算出來的內參是複數形式,不知道問題出在**,構建求單映性矩陣h的矩陣l的時候,如果影象上角點選取不同就會出現很大的差異,今天終於又除錯了很多,看到一篇**寫到,因為矩陣l上數量級相差太大,因為裡面有影象平面座標,數量級是100~1,而世界座標與影象座標乘積數量積將在1000~1之間,得到的s矩陣對角元素數量級為10的8次冪。所以對l進行了改造,將影象座標歸一化變換了一下。在下面的normuvfun()函式中;而且今天在計算l矩陣時,選取了影象的中間的兩個點,在本例中就是第23個到26的點。
function h=funh(m,m,flag)%g根據讀入的資訊,求出h,flag是表示第幾幅影象的意思;h為單應性矩陣;
%%%%---輸入變數 m:為模板齊次座標,維數為3*npt;
%%%% m:影象畫素齊次座標, 維數為:3*npt*flag
%%% flag:影象個數,幾副影象,這裡取了三副;
%%%%---輸出變數:h,是模板座標矩陣與影象座標矩陣之間的單映性矩陣;
%%%%---h應該滿足min∑||mi-mi'||的最小平方和;其中mi'表示消去s計算得到影象座標期望值。
%%%---依據:sm=hm. 消去s計算得到影象座標期望值:mi'=1/h3*mi[h1*mi;h2*mi] hi表示h的i行向量;
%%%---[mt 0t -umt ] [h1']
% [ 0t mt -vmt ] [h2']=0;
% [h3']
[l,npt]=size(m);%npt是模板上有多少個點。
maxone=ones(1,npt);
%m=[m;maxone];
u=m(1,:,flag); %u為三副影象的x座標,
v=m(2,:,flag); %v三副影象的y的座標
%構造l矩陣,奇異分解求h.
o=zeros(1,3);
l=zeros(2*npt,9);
mt=m';
%講實際影象平面座標變化,因為l中有世界座標、影象座標數量級相差太大,所以l矩陣條件數大
[un,vn,hinv]=normuvfun(u,v);
um=zeros(npt,3);
% for i=1:length(u)
% um(i,:)=ut(i).*mt(i,:);
% end
% for i=1:length(v)
% vm(i,:)=vt(i).*mt(i,:);
% end
% % l=[m' o' -um;o' m' -vm]; %l*h=0;求解h,選取n個點,l是2n*9個的矩陣;
%下面需要分解l就出的解為h
% l55=[l(7:12,:);l(49:54,:)];% 一副影象選取了6個點;
% [u,s,v]=svd(l55'*l55);
% l=[m' o' -um;o' m' -vm];
for i=1:length(m)
l(2*i-1,:)=[mt(i,:) o -un(1,i)*mt(i,:)];
l(2*i,:)= [o mt(i,:) -vn(1,i)*mt(i,:)];
end% -- %l*h=0;求解h,選取n個點,l是2n*9個的矩陣;
% --[u s v]=svd(l'l)
% --選取中間的4個點計算h,這個四個點表示為(npt-3)行到(npt+4)行;
% --lnpt是8*9矩陣;
lnpt=l(floor(npt)-3:floor(npt)+4,:);
[u s v]=svd(lnpt'*lnpt);
[r,m]=size(v);
%hh(:,:)=v(:,m)./v(l,m);%h的解就是 v的最後一列,並且把最後乙個元素變成1。
hh=v(:,m);
hnorm=reshape(hh,3,3);
%空間平面與實際影象座標平面的單映性矩陣h:
h=hnorm*hinv;
h=h/h(3,3);
下面是歸一化變換函式
%function [un,vn,hinv]=normuvfun(u,v)
%%%%%%function:將影象座標歸一化處理,採用非方式處理兩個座標軸上的資料,縮放比例不相等,但經處理後使各點到原點距離的平均值為1.
% 平均值:mu=mean(ui),mv=mean(vi),
% 各個點相對應平均值的相對量:du=ui-mu,
% dv=vi=mv;
% 求u,v軸的縮放因子:su=1/mean(abs(dui)),
% sv=1/mean(abs(dvi))
% 總的變換關係:un=dui/mean(abs(dui)),
% vn=dvi=/mean(abs(dvi))
% --輸入變數(u,v)
% --輸出為歸一化後影象座標(un,vn)和反變換矩陣hinv
%%%-----------author:liyingyan-----------------------------
%%%---------date:2009.03.13--------------------------
[r,npt]=size(u);
du=zeros(r,npt);
dv=zeros(r,npt);
mu=mean(u);
mv=mean(v);
for i=1:npt
du(i)=abs(u(i)-mu);
dv(i)=abs(v(i)-mv);
endsu=1/mean(du);
sv=1/mean(dv);
un=du*su;
vn=dv*sv;
%m=hinv*mn--變換後的影象平面座標需要與乙個反變換矩陣相乘猜得到實際影象平面座標;
hinv=[1/su 0 mu;0 1/sv mv;
0 0 1];
Matlab 在Matlab中如何畫圓
rectangle函式功能 建立二維矩形物件。1.1 rectangle position x,y,w,h 其中以x,y為起始座標開始,畫出長為w,寬為h的矩形。1.2 rectangle curvature a,b 指定矩陣邊的曲率,可以使它從矩形到橢圓不同變化,水平曲率x為矩形寬度的分數,是沿著...
在MATLAB中安裝libsvm
搞了一天,看了很多資料,終於搞好了matlab中呼叫大牛寫好的svm庫,將結果告訴大家避免以後走彎路。1.參考 詳解 2.操作流程 請注意 詳細操作流程請參考上面的 詳解 這裡只說大框架和詳解裡沒有提到的問題。a.設定path file set path add with subfolders 加入...
在matlab中配置vlfeat
在vlfeat官網上是這麼介紹vlfeat的 vlfeat開源庫實現了很多著名的機器視覺演算法,如hog,sift,mser,k means,hierarchical k means,agglomerative information bottleneck,slic superpixels,和 qu...