2017-10-27 7 views
0

tl; dr;コンパイル時のピクセルタイプをcv::Mat my_mat = cv::imread("myfile.png")から取得するにはどうすればよいですか?Opencv、コンパイル時にピクセルのタイプを調べる

私はマットのイテレータに取り、私が書いた機能、持っている:私は、コンパイラが把握することが可能だと思うので、私は、明示的RAIが何であるかを明記せずにこの機能を使用することができます

template <typename RAI> 
void my_func(RAI mat_begin, RAI mat_end) { 
    typedef typename std::iterator_traits<RAI>::value_type T; 
    do_stuff<T>(*mat_begin); 
} 

int main() { 
    cv::Mat my_image = cv::imread("my_file"); 
    my_func(my_image.begin(), my_image.end()); 
} 

をそれはコンパイル時に何ですか。

Mat全体を取り上げるには、これをリファクタリングする必要があることが判明しました。しかし、今はdo_stuff<T>を呼び出す方法を見つけることができません。なぜなら、私の行列イテレータタイプのiterator_traitsから、Tが何であるかを知る方法がわからないからです。コンパイル時を理解する方法はわかりません私のコードでは、行列のイテレータタイプはimreadで取得されているので、実行時にピクセルの型を設定するように思われます。

+0

my_mat.typeである()あなたのタイプのOpenCVのエンコーディングを提供します。適切な組み込み型で関数を呼び出すには、switch-caseが必要です。 Tl; dr; imreadのデフォルト値はCV_8UC3 – Miki

+1

Btw、tl; dr; ) – Miki

+0

しかし、my_mat.type()は実行時の型ですか?提供されたサンプルが正しく動作するため、コンパイラはコンパイル時に適切な型を見つけ出す必要があります。 – Scott

答えて

1

OpenCVは、Mat.type()の値を照会して基本となるピクセルタイプを判断し、ifまたはswitchステートメントを使用して特定のテンプレートの特殊化を呼び出します。

例えば、ここfloodfill.cppからの抜粋がimgproc/src/floodfill.cpp

Mat img = _image.getMat(); 
... 
int type = img.type(); 
... 
if(type == CV_8UC1) 
    floodFillGrad_CnIR<uchar, uchar, int, Diff8uC1>(
      img, mask, seedPoint, nv_buf.b[0], newMaskVal, 
      Diff8uC1(ld_buf.b[0], ud_buf.b[0]), 
      &comp, flags, &buffer); 
else if(type == CV_8UC3) 
    floodFillGrad_CnIR<Vec3b, uchar, Vec3i, Diff8uC3>(
      img, mask, seedPoint, Vec3b(nv_buf.b), newMaskVal, 
      Diff8uC3(ld_buf.b, ud_buf.b), 
      &comp, flags, &buffer); 
else if(type == CV_16UC1) 
    floodFillGrad_CnIR<unsigned short, uchar, int, Diff16uC1>(
      img, mask, seedPoint, nv_buf.s[0], newMaskVal, 
      Diff16uC1(ld_buf.s[0], ud_buf.s[0]), 
      &comp, flags, &buffer); 
else if(type == CV_32SC1) 
    floodFillGrad_CnIR<int, uchar, int, Diff32sC1>(
      img, mask, seedPoint, nv_buf.i[0], newMaskVal, 
      Diff32sC1(ld_buf.i[0], ud_buf.i[0]), 
      &comp, flags, &buffer); 
else if(type == CV_32SC3) 
    floodFillGrad_CnIR<Vec3i, uchar, Vec3i, Diff32sC3>(
      img, mask, seedPoint, Vec3i(nv_buf.i), newMaskVal, 
      Diff32sC3(ld_buf.i, ud_buf.i), 
      &comp, flags, &buffer); 
else if(type == CV_32FC1) 
    floodFillGrad_CnIR<float, uchar, float, Diff32fC1>(
      img, mask, seedPoint, nv_buf.f[0], newMaskVal, 
      Diff32fC1(ld_buf.f[0], ud_buf.f[0]), 
      &comp, flags, &buffer); 
else if(type == CV_32FC3) 
    floodFillGrad_CnIR<Vec3f, uchar, Vec3f, Diff32fC3>(
      img, mask, seedPoint, Vec3f(nv_buf.f), newMaskVal, 
      Diff32fC3(ld_buf.f, ud_buf.f), 
      &comp, flags, &buffer); 
else 
    CV_Error(CV_StsUnsupportedFormat, ""); 
関連する問題