OpenCV中是很常見訪問像素的Mat
對象,像這樣:打開CV通用墊功能頭
float b = A.at<float>(4,5);
的問題是,如果你不知道數據先驗的類型,你卡住。有沒有一種方法可以編寫接受Mat
模板類型爲T
的通用函數頭?我想爲線性代數計算構建函數,並且我不希望if
子句分開double
和float
。類似於:
void func(Mat <T> a) {
a.at<T>(3,4) = ...
這在OpenCV中可能嗎?
OpenCV中是很常見訪問像素的Mat
對象,像這樣:打開CV通用墊功能頭
float b = A.at<float>(4,5);
的問題是,如果你不知道數據先驗的類型,你卡住。有沒有一種方法可以編寫接受Mat
模板類型爲T
的通用函數頭?我想爲線性代數計算構建函數,並且我不希望if
子句分開double
和float
。類似於:
void func(Mat <T> a) {
a.at<T>(3,4) = ...
這在OpenCV中可能嗎?
這可以簡單地通過模板化的功能:
template<typename T>
void func(Mat a) {
a.at<T>(3,4) = ...
但請注意,你有沒有簡單的方法來約束的類型T是雙人牀或浮動,以及其他你的算法將無法工作,可能類型,但它可能不是一個實際的問題。
還要注意使用模板的缺點:What are the disadvantages of using templates?
看來要做到這一點是使用了Mat_
對象,而不是Mat
另一種方式:
template<typename T>
void func(Mat_ <T> a) {
cout << a(0,0) << endl;
}
如果你想傳遞一個Mat
到func
,您必須指定類型:
如果你與原始的Mat
類型不同,OpenCV將爲您預製轉換。
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通道陣列等
此代碼不編譯 - 你試過這個或者你只是猜測? – nbubis
我沒有猜測,但我不得不承認,我沒有試圖編譯它抱歉,函數內部有一個錯字。 – zakinster
實際上,我並沒有太注意openCV的Mat類,我認爲這是Mat代碼,它是你的代碼所建議的模板,但它實際上只是方法,所以錯字是相反的方式。最後的編輯應該編譯爲openCV Mat類。 – zakinster