2011-11-30 88 views
3

使用CvMat類型時,數據類型對於保持程序運行至關重要。如何確定CvMat的數據類型

例如,根據您的數據的類型是否爲floatunsigned char,你會選擇以下兩種命令之一:

cvmGet(mat, row, col); 
cvGetReal2D(mat, row, col); 

是否有一個通用的方法呢?如果將錯誤的數據類型矩陣傳遞給這些調用,則會在運行時崩潰。這成爲一個問題,因爲我定義的函數正在通過幾種不同類型的矩陣。

如何確定矩陣的數據類型,以便隨時訪問其數據?

我嘗試使用「type()」函數。

CvMat* tmp_ptr = cvCreateMat(t_height,t_width,CV_8U); 
std::cout << "type = " << tmp_ptr->type() << std::endl; 

這不編譯,說"term does not evaluate to a function taking 0 arguments"。如果我的話type後取出支架,我得到一個類型1111638032

編輯最小的應用程序,重新產生此...的

int main(int argc, char** argv) 
{ 
    CvMat *tmp2 = cvCreateMat(10,10, CV_32FC1); 
    std::cout << "tmp2 type = " << tmp2->type << " and CV_32FC1 = " << CV_32FC1 << " and " << (tmp2->type == CV_32FC1) << std::endl; 
} 

輸出:tmp2 type = 1111638021 and CV_32FC1 = 5 and 0

回答

8

type是一個變量,而不是一個函數

CvMat* tmp_ptr = cvCreateMat(t_height,t_width,CV_8U); 
std::cout << "type = " << tmp_ptr->type << std::endl; 

編輯:

至於type異常值被印刷,according to this answer,該變量存儲比數據類型更多。

所以,檢查cvMat數據類型的合適的方法是使用宏CV_MAT_TYPE()

CvMat *tmp2 = cvCreateMat(3,1, CV_32FC1); 
std::cout << "tmp2 type = " << tmp2->type << " and CV_32FC1 = " << CV_32FC1 << " and " << (CV_MAT_TYPE(tmp2->type) == CV_32FC1) << std::endl; 

數據類型的命名約定是:

CV_<bit_depth>(S|U|F)C<number_of_channels> 

S = Signed integer 
U = Unsigned integer 
F = Float 

E.g.: CV_8UC1 means an 8-bit unsigned single-channel matrix, 
     CV_32FC2 means a 32-bit float matrix with two channels. 
+0

看,這是我的想法,但類型的結果是1111638032,這是完全錯誤的.CV_8U應導致整數爲0.這是我的困惑來自的地方。爲什麼這種類型會出錯? – Chris

+0

如果你用'CV_8UC1'創建墊子怎麼辦?您嘗試創建的墊子的大小(寬度/高度)是多少?你沒有測試'cvCreateMat()'的成功,這可能是一個好主意。 – karlphillip

+0

相同的想法..我再次嘗試與32FC1。 CvMat * tmp2 = cvCreateMat(10,10,CV_32FC1);我比較了tmp2->類型和CV_32FC1。 tmp2-> type給出1111638021,cv浮點給出5. – Chris

3

有一個叫功能

CV_MAT_TYPE() 

所以你可以做這樣的事情

CV_MAT_TYPE(tmp2->type) 

即將返回您需要的5等於CV_32FC1。

PO。我開始尋找我用CV_MAT_TYPE獲得的5的含義,所以你給了我你的問題的答案。謝謝。

0

雖然手頭的問題與調用/訪問Mat類的'type'成員有關,但我相信opencv的ts模塊中部署的CV_ENUM用法將爲您提供更多信息選擇。

該類型實質上是從「深度」成員值和「通道」成員值構建的。通過在ts模塊中使用MatDepth枚舉,PrintTo方法可用。

如果您希望只需通過屏蔽(& -operator)位值並檢查其餘位,就可以從該類型中提取通道計數。

#include <opencv2/ts/ts_perf.hpp> 
#include <iostream> 

// Method for printing the information related to an image                                    
void printImageInfo(std::ostream * os, cv::Mat * image){ 
    int type = image->type(); 
    int channels = image->channels(); 
    cv::Size imageSize = image->size(); 
    perf::MatDepth depth(image->depth()); 
    *os << "Image information: " << imageSize << " type " << type 
     << " channels " << channels << " "; 
    *os << "depth " << depth << " ("; 
    depth.PrintTo(os); 
    *os << ")" << std::endl; 

}