2013-04-12 7 views
5

OpenCVのでは、そうのようなMatオブジェクト内のピクセルにアクセスすることが一般的です:オープンCVジェネリックマット機能ヘッダ

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

問題は、あなたがデータアプリオリの種類がわからない場合、あなたがしている、あります立ち往生した。テンプレートタイプTMatを受け入れる汎用関数ヘッダーを記述する方法はありますか?私は線形代数計算のための関数を構築したいと思います。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を制約する簡単な方法を持っていないことに注意してください、そして、あなたのアルゴリズムはおそらく他では動作しません実際の問題ではない可能性があります。あなたがMatを渡したい場合は

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

What are the disadvantages of using templates?

+0

このコードはコンパイルされません - これを試しましたか、まあまあですか? – nbubis

+0

私は推測していませんでしたが、私はそれをコンパイルしようとしなかったことを認めなければなりません、機能の中にタイプミスがありました。 – zakinster

+0

まあ実際に私はopenCVのMatクラスにはあまり注意を払っていませんでした。私はあなたのコードが示唆しているようにテンプレート化されたMatクラスだと思っていましたが、実際はそのメソッドだけです。最後の編集は、openCV Matクラスの方にコンパイルする必要があります。 – zakinster

3

それは代わりにMatMat_オブジェクトを使用することですこれを行うにはもう一つの方法が表示されます。

も使用して、テンプレートの欠点を注意してくださいfuncには、タイプを指定する必要があります。

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

元のMatタイプとは異なるタイプの場合、OpenCVは変換を実行します。

1

OpenCV 2 Cookbook 40ページは不可能であると主張しています。また、Mat_に関する:

"が返さタイプ 各コールのテンプレート引数として指定しなければならないため、CVの方法で::マットクラスが時々 面倒であることができる使用マトリックス型が既知である場合には。 、それはCV ::マットのテンプレートサブクラスである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() メソッドはコンパイル時にどの型を返すかを知っています。

EDIT:使用Mat.type()

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

コンソール出力:

16 

ウィキ:メソッドはれるCvMat型システムと互換性のある行列要素タイプ、IDを返しますCV_16SC3または16ビット符号付き3チャネル配列など

関連する問題