1

次のコードを使用して Mat の要素にアクセスしたところ、この問題が見つかりました。 ここに画像の説明を入力

ここで 2 つの問題が発生します。

  • nzpxl Mat は CV_16UC2 型をハード定義するか、この関数の呼び出し元から渡されます
  • nzpxl は at によってアクセスされますが、これもハード フォームです。

そのため、両者の間に適切な対応がない場合、関数はクラッシュします。どちらが互換性があるかさえほとんどわかりません。たとえば、CV_16UC2 は Vec2i に対応しますか??

質問 1 : これはハードコーディングのみ可能ですか?
質問 2 : 互換性のあるタイプを知る方法は?

編集01:情報不足でごめんなさい!Mat_ テンプレートについては、明確にするために Mat_ を使用して独自の型を定義し、OpenCVデフォルトの型を使用しないようにする投稿を見てきました。これは私の2番目の質問に対する1つの答えですか?

4

1 に答える 1

1

マトリックスに格納するデータの種類を決定しなければならない瞬間があり、これはどこかに「ハードコーディング」する必要があります。

データ マトリックスが CV_16UC2 型であると判断した場合は、このマトリックス内のピクセルにアクセスするすべての関数 (たとえば、at<> を使用) で、マトリックスが期待される形式であることを確認する必要があります。

void someFunction(cv::Mat &myMatrixOf16UC2) {
  // using asserts
  assert(myMatrixOf16UC2.type() == CV_16UC2);
  // or using exceptions
  if (myMatrixOf16UC2.type() != CV_16UC2)
    throw  someException;


  // do the job

}

ちなみに int は 32 ビットなので、Vec2i は CV_32SC2 で割り当てられた行列を扱う必要があります。CV_16UC2 -> cv::Vec2s、または OpenCV に定義済みの typedef がない cv::Vec です。

便利な方法の 1 つは、使用しているデータを typedef と対応する type() 関数 (ヘッダーなど) でプログラムのどこかに定義することです。

 typedef cv::Vec<unsigned short, 2> pixel_t;

 int getOpenCVTypeForMyPixelType() { return CV_16UC2; }

次に、short から int または float に変更する場合は、それらの関数を変更するだけです。

于 2012-09-14T08:52:27.760 に答える