1. 程式人生 > >Matlab讀取xml檔案——OpenCV通過FileStorage儲存的矩陣Mat

Matlab讀取xml檔案——OpenCV通過FileStorage儲存的矩陣Mat

問題描述:

            最近在做實驗的時候,用的是OpenCV,需要將矩陣通過圖表的方式顯示出來,例如:直方圖。But 我不太會用OpenCV將圖表顯示出來。此時此刻,想到了強大的軟體Matlab。但是,資料是用OpenCV中的FileStorage方法用xml檔案將矩陣進行儲存。Matlab如何將矩陣進行讀入是關鍵。

網上有很多的方法,但是感覺對像我這樣儲存的使用者太過複雜,於是就寫一篇簡單的,希望能幫助到大家。

解決辦法

   OpenCV中將矩陣寫入xml檔案的方法很簡單,利用FileStorage方法,基本三行就可以搞定。

FileStorage mul_wr(".\\0.xml", FileStorage::WRITE);
mul_wr << "result" << result;
mul_wr.release();</span>
   最後得到的xml檔案結構如下所示(只給出一部分):
 <?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>
  下面,就用上面這個例子,用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>
   這裡得到的矩陣last就是OpenCV處理後的資料,就可以用個數據,在matlab平臺上進行資料處理。

其他小知識
   matlab中可以用class(var)查詢資料var的型別,例如var是double型別,這class(var)就是double;

   matlab中可以用str2num(a),將string型別轉化為數字型別。

祝大家學習健康,生活快樂!!!