Matlab讀取xml檔案——OpenCV通過FileStorage儲存的矩陣Mat
阿新 • • 發佈:2019-01-24
問題描述:
最近在做實驗的時候,用的是OpenCV,需要將矩陣通過圖表的方式顯示出來,例如:直方圖。But 我不太會用OpenCV將圖表顯示出來。此時此刻,想到了強大的軟體Matlab。但是,資料是用OpenCV中的FileStorage方法用xml檔案將矩陣進行儲存。Matlab如何將矩陣進行讀入是關鍵。
網上有很多的方法,但是感覺對像我這樣儲存的使用者太過複雜,於是就寫一篇簡單的,希望能幫助到大家。
解決辦法
OpenCV中將矩陣寫入xml檔案的方法很簡單,利用FileStorage方法,基本三行就可以搞定。
最後得到的xml檔案結構如下所示(只給出一部分):FileStorage mul_wr(".\\0.xml", FileStorage::WRITE); mul_wr << "result" << result; mul_wr.release();</span>
下面,就用上面這個例子,用Matlab 程式碼將矩陣進行讀入程式碼如下所示:<?xml version="1.0"?> <opencv_storage> <result type_id="opencv-matrix"> <rows>50000</rows> <cols>1</cols> <dt>d</dt> <data> 2.8882032819301821e+002 -6.8150904489448294e-001 4.5750426905229688e+001 1.8478395644389093e+002 -1.3984500984381884e+002 -5.2998318639583886e+001 2.6773534634662792e+002 1.1899971175007522e+000 -7.5492174654966220e+001 2.1866303959977813e+002 -1.3364549682929646e+002 1.7896846196893603e+002 9.4229298247839324e+001 1.0382060136087239e+002 3.3998946248553693e+001 -1.5178917868062854e+002 1.5348514711554162e+002 3.8458418705937220e+001 7.1695511569269001e+001 -8.9653154644649476e+001 4.4976377896527993e+000 2.7091610717397998e+002 2.4743137456942350e+001 -1.1738243190571666e+001 2.0047841143980622e+002 1.6443823127949145e+001 </data></result> </opencv_storage>
這裡得到的矩陣last就是OpenCV處理後的資料,就可以用個數據,在matlab平臺上進行資料處理。<span style="font-size:18px;">function opencv2matlab() % 讀取opencv中xml檔案,表示的是矩陣。 xmlDoc = xmlread('0.xml'); %得到矩陣的行數,如果儲存了多個矩陣,可以進行迴圈 item(i) row = xmlDoc.getElementsByTagName('rows').item(0).getFirstChild.getData; %得到矩陣的列數 col = xmlDoc.getElementsByTagName('cols').item(0).getFirstChild.getData; row = str2num(row);%讀入是string型別,轉為數字; col = str2num(col);%同上 %讀入矩陣,這裡注意,矩陣的行數和列數跟xml儲存的方式相同,例如,這裡是25000x2,所以讀入的矩陣是25000x2 histstring =char(xmlDoc.getElementsByTagName('data').item(0).getFirstChild.getData); %對矩陣進行處理,得到原來的矩陣 %將char型別轉為數字型別 hists = str2num(histstring); last = eye(row,col,'double'); [a,b] = size(hists); k =1; %disp(); n =1; for i=1:a for j =1:b m=1; last(n,m) = hists(i,j); m= m+1; if m==col n = n+1; end end end [a,b] = size(last); disp(last); end</span></span>
其他小知識
matlab中可以用class(var)查詢資料var的型別,例如var是double型別,這class(var)就是double;
matlab中可以用str2num(a),將string型別轉化為數字型別。
祝大家學習健康,生活快樂!!!