使用C++將OpenCV中Mat的數(shù)據(jù)寫(xiě)入二進(jìn)制文件,用Matlab讀出
在使用OpenCV開(kāi)發(fā)程序時(shí),如果想查看矩陣數(shù)據(jù),比較費(fèi)勁,而matlab查看數(shù)據(jù)很方便,有一種方法,是matlab和c++混合編程,可以用matlab訪問(wèn)c++的內(nèi)存,可惜我不會(huì)這種方式,所以我就把數(shù)據(jù)寫(xiě)到文件里,用matlab讀出來(lái),然后用matlab各種高級(jí)功能查看數(shù)據(jù)的值。
1、將Mat的數(shù)據(jù)寫(xiě)入指定文件
為了方便拿來(lái)主義者,我直接把這個(gè)函數(shù)貼出來(lái),你只要把代碼拷貝到自己的代碼里,就可以直接用了。如果有問(wèn)題,趕緊評(píng)論,我會(huì)盡快看看問(wèn)題出在哪里。
#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來(lái)讀數(shù)據(jù)的時(shí)候,你必須知道Mat的寬度,高度,通道數(shù),單個(gè)通道元素的類(lèi)型!
以三通道,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;?%?這個(gè)地方你要指定為你自己的矩陣的寬度 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
我的用的測(cè)試圖像:
執(zhí)行matlab后的顯示圖像:
這個(gè)實(shí)驗(yàn)說(shuō)明,abWrite很大可能是沒(méi)有問(wèn)題的,如果你愿意測(cè)試,趕緊寫(xiě)個(gè)代碼測(cè)試下吧。測(cè)試有問(wèn)題,歡迎評(píng)論,我會(huì)盡快解決。