在使用OpenCV開發程序時,如果想查看矩陣數據,比較費勁,而matlab查看數據很方便,有一種方法,是matlab和c++混合編程,可以用matlab訪問c++的內存,可惜我不會這種方式,所以我就把數據寫到文件裡,用matlab讀出來,然後用matlab各種高級功能查看數據的值。
為了方便拿來主義者,我直接把這個函數貼出來,你只要把代碼拷貝到自己的代碼裡,就可以直接用了。如果有問題,趕緊評論,我會盡快看看問題出在哪裡。
#include#include #include #include using 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; }
在用matlab來讀數據的時候,你必須知道Mat的寬度,高度,通道數,單個通道元素的類型!
以三通道,UCHAR為例,讀取數據,顯示數據。
C++程序,用於調用abWrite函數。
Mat orgIm = imread("im.jpeg"); abWrite(orgIm, "./orgIm_8UC3.dat");
width = 321; % 這個地方你要指定為你自己的矩陣的寬度 height = 481; % 這裡也要指定為你自己的矩陣的高度 channels = 3; % 通道數 fs = fopen('orgIm_8UC3.dat', 'rb'); db = fread(fs, 'uint8'); % 注意,這裡用的是unsigned int8 fclose(fs); ou = reshape(db, channels*height, width); % 調整顯示格式 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)) % 一定要記得轉換為uint8
我的用的測試圖像:
執行matlab後的顯示圖像:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140613/20140613092026220.png" alt="" />
這個實驗說明,abWrite很大可能是沒有問題的,如果你願意測試,趕緊寫個代碼測試下吧。測試有問題,歡迎評論,我會盡快解決。