程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用C++將OpenCV中Mat的數據寫入二進制文件,用Matlab讀出

使用C++將OpenCV中Mat的數據寫入二進制文件,用Matlab讀出

編輯:C++入門知識

在使用OpenCV開發程序時,如果想查看矩陣數據,比較費勁,而matlab查看數據很方便,有一種方法,是matlab和c++混合編程,可以用matlab訪問c++的內存,可惜我不會這種方式,所以我就把數據寫到文件裡,用matlab讀出來,然後用matlab各種高級功能查看數據的值。


1、將Mat的數據寫入指定文件

為了方便拿來主義者,我直接把這個函數貼出來,你只要把代碼拷貝到自己的代碼裡,就可以直接用了。如果有問題,趕緊評論,我會盡快看看問題出在哪裡。

#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;
}

2、用matlab讀出二進制文件中的數據

在用matlab來讀數據的時候,你必須知道Mat的寬度,高度,通道數,單個通道元素的類型!

以三通道,UCHAR為例,讀取數據,顯示數據。


C++程序,用於調用abWrite函數。

Mat orgIm = imread("im.jpeg");
abWrite(orgIm, "./orgIm_8UC3.dat");

Matlab程序,讀出orgIm_8UC3.dat的數據,並調整為RGB數據顯示。

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很大可能是沒有問題的,如果你願意測試,趕緊寫個代碼測試下吧。測試有問題,歡迎評論,我會盡快解決。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved