使用C++將OpenCV中Mat的數(shù)據(jù)寫入二進(jìn)制文件,用Matlab讀出
在使用OpenCV開發(fā)程序時,如果想查看矩陣數(shù)據(jù),比較費(fèi)勁,而matlab查看數(shù)據(jù)很方便,有一種方法,是matlab和c++混合編程,可以用matlab訪問c++的內(nèi)存,可惜我不會這種方式,所以我就把數(shù)據(jù)寫到文件里,用matlab讀出來,然后用matlab各種高級功能查看數(shù)據(jù)的值。
1、將Mat的數(shù)據(jù)寫入指定文件
為了方便拿來主義者,我直接把這個函數(shù)貼出來,你只要把代碼拷貝到自己的代碼里,就可以直接用了。如果有問題,趕緊評論,我會盡快看看問題出在哪里。
#include#include#include#includeusing?namespace?std;
using?namespace?cv;
int?abWrite(const?Mat?&im,?const?string?&fname)
{
??ofstream?ouF;
??ouF.open(fname.c_str(),?std::ofstream::binary);
??if?(!ouF)
??{
????cerr?<<?"failed?to?open?the?file?:?"?<<?fname?<<?endl;
????return?0;
??}
??for?(int?r?=?0;?r?<?im.rows;?r++)
??{
????ouF.write(reinterpret_cast(im.ptr(r)),?im.cols*im.elemSize());
??}
??ouF.close();
??return?1;
}
2、用matlab讀出二進(jìn)制文件中的數(shù)據(jù)
在用matlab來讀數(shù)據(jù)的時候,你必須知道Mat的寬度,高度,通道數(shù),單個通道元素的類型!
以三通道,UCHAR為例,讀取數(shù)據(jù),顯示數(shù)據(jù)。
C++程序,用于調(diào)用abWrite函數(shù)。
Mat?orgIm?=?imread("im.jpeg");
abWrite(orgIm,?"./orgIm_8UC3.dat");
Matlab程序,讀出orgIm_8UC3.dat的數(shù)據(jù),并調(diào)整為RGB數(shù)據(jù)顯示。
width??=?321;?%?這個地方你要指定為你自己的矩陣的寬度
height?=?481;?%?這里也要指定為你自己的矩陣的高度
channels?=?3;?%?通道數(shù)
fs?=?fopen('orgIm_8UC3.dat',?'rb');
db?=?fread(fs,?'uint8');?%?注意,這里用的是unsigned?int8
fclose(fs);
ou?=?reshape(db,?channels*height,?width);?%?調(diào)整顯示格式
im(:,:,1)?=?ou(3:3:end,?:)';?%?R通道
im(:,:,2)?=?ou(2:3:end,?:)';?%?G通道
im(:,:,3)?=?ou(1:3:end,?:)';?%?B通道
figure;?imshow(uint8(im))?%?一定要記得轉(zhuǎn)換為uint8我的用的測試圖像:
執(zhí)行matlab后的顯示圖像:
這個實(shí)驗(yàn)說明,abWrite很大可能是沒有問題的,如果你愿意測試,趕緊寫個代碼測試下吧。測試有問題,歡迎評論,我會盡快解決。





