簡體   English   中英

打開CV通用Mat函數頭

[英]Open CV generic Mat function headers

在OpenCV中,通常像這樣訪問Mat對象中的像素:

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

問題是,如果您不知道數據先驗的類型,那么您將陷入困境。 有沒有一種方法可以編寫接受模板類型為TMat通用函數標頭? 我想構建用於線性代數計算的函數,並且我不想讓if子句分隔doublefloat 就像是:

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

在OpenCV中有可能嗎?

看來,執行此操作的另一種方法是使用Mat_對象而不是Mat

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

如果要將Mat傳遞給func ,則必須指定類型:

Mat a;
func(Mat_<float>(a)); 

如果您使用與原始Mat類型不同的類型,則OpenCV將為您執行轉換。

只需通過模板化函數就可以實現:

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

但是請注意,沒有簡單的方法將T類型限制為double或float,並且您的算法可能無法在其他類型上運行,但這可能不是實際問題。

還請注意使用模板的缺點:使用模板的缺點是什么?

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

“使用cv :: Mat類的at方法有時會很麻煩,因為必須為每個調用將返回的類型指定為模板參數。在已知矩陣類型的情況下,可以使用cv :: Mat_ class是cv :: Mat的模板子類。

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

由於cv :: Mat_元素的類型是在創建變量時聲明的,因此operator()方法在編譯時就知道要返回哪種類型。”

編輯 :使用Mat.type()

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

控制台輸出:

16

Wiki:該方法返回與CvMat類型系統兼容的矩陣元素類型,一個id,例如CV_16SC3或16位帶符號的3通道數組等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM