2013-04-12 45 views
5

OpenCV中是很常見訪問像素的Mat對象,像這樣:打開CV通用墊功能頭

float b = A.at<float>(4,5); 

的問題是,如果你不知道數據先驗的類型,你卡住。有沒有一種方法可以編寫接受Mat模板類型爲T的通用函數頭?我想爲線性代數計算構建函數,並且我不希望if子句分開doublefloat。類似於:

void func(Mat <T> a) { 
    a.at<T>(3,4) = ... 

這在OpenCV中可能嗎?

回答

1

這可以簡單地通過模板化的功能:

template<typename T> 
void func(Mat a) { 
    a.at<T>(3,4) = ... 

但請注意,你有沒有簡單的方法來約束的類型T是雙人牀或浮動,以及其他你的算法將無法工作,可能類型,但它可能不是一個實際的問題。

還要注意使用模板的缺點:What are the disadvantages of using templates?

+0

此代碼不編譯 - 你試過這個或者你只是猜測? – nbubis

+0

我沒有猜測,但我不得不承認,我沒有試圖編譯它抱歉,函數內部有一個錯字。 – zakinster

+0

實際上,我並沒有太注意openCV的Mat類,我認爲這是Mat代碼,它是你的代碼所建議的模板,但它實際上只是方法,所以錯字是相反的方式。最後的編輯應該編譯爲openCV Mat類。 – zakinster

3

看來要做到這一點是使用了Mat_對象,而不是Mat另一種方式:

template<typename T> 
void func(Mat_ <T> a) { 
    cout << a(0,0) << endl; 
} 

如果你想傳遞一個Matfunc,您必須指定類型:

如果你與原始的Mat類型不同,OpenCV將爲您預製轉換。

1

OpenCV 2 Cookbook第40頁聲稱這是不可能的。另外,關於Mat_:

「的CV的方法使用::墊類有時是麻煩的 因爲返回的類型必須被指定爲用於 每個呼叫模板參數如遇有矩陣型是已知的。 ,所以能夠 使用Cv :: Mat_類,這是CV ::墊的模板子類。

cv::Mat_<uchar> im2= image; // im2 refers to image 
im2(50,100)= 0; //access to row 50 and column 100 

由於在創建變量當Cv的類型:: Mat_ 元件被聲明,運算符() 方法在編譯時知道要返回的類型。「

EDIT:使用Mat.type()

Mat image=imread("image.bmp"); 
cout<<image.type(); 

控制檯輸出:

16 

維基:該方法返回矩陣元素類型,一個ID,與所述類型與CvMat系統兼容,像CV_16SC3或16位有符號3通道陣列等