5

MatOpenCV では、次のようにオブジェクト内のピクセルにアクセスするのが一般的です。

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

問題は、アプリオリにデータのタイプがわからない場合、行き詰まってしまうことです。Matwith template typeを受け入れるジェネリック関数ヘッダーを作成する方法はありTますか? 線形代数計算用の関数を作成したいのですが、 and を区切る句は使いたくありませifん。何かのようなもの:doublefloat

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

これはOpenCVで可能ですか?

4

3 に答える 3

3

これを行うもう1つの方法は、のMat_代わりにオブジェクトを使用することMatです。

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

Mata をtoに渡したい場合はfunc、型を指定する必要があります。

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

元のMat型とは異なる型を使用すると、OpenCV が変換を実行します。

于 2013-04-12T08:56:44.473 に答える
1

これは、関数をテンプレート化するだけで可能です:

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

ただし、型 T を double または float のみに制約する簡単な方法がないことに注意してください。アルゴリズムはおそらく他の型では機能しませんが、実際の問題ではない可能性があります。

テンプレートを使用することの欠点にも注意してください: テンプレートを使用することの欠点は何ですか?

于 2013-04-12T08:01:44.360 に答える
1

OpenCV 2 クックブックの 40 ページでは、それは不可能だと主張しています。また、 Mat_ について:

" cv::Mat クラスの at メソッドを使用すると、呼び出しごとに返される型をテンプレート引数として指定する必要があるため、面倒な場合があります。行列の型がわかっている場合は、cv::Mat_ を使用できます。 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: このメソッドは、CV_16SC3 や 16 ビットの符号付き 3 チャネル配列など、CvMat 型システムと互換性のある行列要素の型、ID を返します。

于 2013-04-12T13:32:19.230 に答える