1.opencv資料型別與常用型別對應關系
想要準確的訪問Mat中元素值,了解opencv中資料型別很重要,他決定了Mat中每個元素所占記憶體的大小。
opencv中各種型別定義:
#define CV_8U 0 //對應uchar
#define CV_8S 1 //對應char
#define CV_16U 2 //對應ushort
#define CV_16S 3 //對應short
#define CV_32S 4 //對應int
#define CV_32F 5 //對應float
#define CV_64F 6 //對應double
#define CV_USRTYPE1 7
...
#define CV_8UC1 CV_MAKETYPE(CV_8U,1) //0
#define CV_8UC2 CV_MAKETYPE(CV_8U,2) //8
#define CV_8UC3 CV_MAKETYPE(CV_8U,3) //16
#define CV_8UC4 CV_MAKETYPE(CV_8U,4) //32
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
#define CV_8SC1 CV_MAKETYPE(CV_8S,1) //1
#define CV_8SC2 CV_MAKETYPE(CV_8S,2) //9
#define CV_8SC3 CV_MAKETYPE(CV_8S,3) //17
#define CV_8SC4 CV_MAKETYPE(CV_8S,4) //33
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
...
#define CV_64FC1 CV_MAKETYPE(CV_64F,1) //6
#define CV_64FC2 CV_MAKETYPE(CV_64F,2) //14
#define CV_64FC3 CV_MAKETYPE(CV_64F,3) //22
#define CV_64FC4 CV_MAKETYPE(CV_64F,4) //38
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
注:CV_MAKETYPE(depth,cn)=(cn-1)*8+depth //定義型別,型別不沖突
補充:opencv中資料型別的變化
注意opencv中各個函式所適用的Mat矩陣資料型別。當Mat矩陣資料型別不合適時,函式呼叫后可能引起資料型別的變化,如果發生改變,從而會對Mat矩陣資料的訪問造成影響。
例:(VS中 C++代碼)
camMatrix = cv::Mat::zeros(3, 3, CV_32FC1); //float
cv::calibrateCamera(ptWs, m_pts, image.size(), camMatrix, distCoeffs, rotations, tranlation, CV_CALIB_FIX_K3);
如上述代碼,新建的內參矩陣camMatrix均為float型別(32位),在呼叫calibrateCamera標定程式進行標定后,內參矩陣camMatrix資料型別由初始的32位float型別變為了64為的double型別,從而導致后面資料訪問出現錯誤。故這里需要將camMatrix初始化為CV_64FC1。
在不確定型別時,可以通過查看原始碼或者除錯查看型別變換得到變數型別。 如實際查看opencv原始碼可以看出calibrateCamera原始碼中,世界坐標(ptWs)與影像點坐標(m_pts)為float型別(32位),而原始碼中內參矩陣(camMatrix)、畸變矩陣(distCoeffs)、旋轉向量矩陣(rotations - (1通道)X3(行)Xn(列))、平移向量矩陣都轉化為了CV_64F型別。
2.Mat資料訪問
2.1 at(i,j)
int ROWS = 100;
int COLS = 200;
Mat img(ROWS , COLS , CV_32FC1);
for (int i=0; i<ROWS ; i++)
{
for (int j=0; j<COLS ; j++)
{
img.at<float>(i,j) = 3.2f;
}
}
2.2 ptr(i)[j]
int ROWS = 100;
int COLS = 200;
Mat img(ROWS , COLS , CV_32FC1);
for (int i=0; i<ROWS ; i++)
{
float* ptr = img.ptr<float>(i);
for (int j=0; j<COLS ; j++)
{
ptr[j] = 3.2f;
}
}
補: 訪問8位影像時,type = uchar;
24位影像時,type = vec3b;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265702.html
標籤:OpenCV
上一篇:comsol激光超聲無損檢測仿真
