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, "");
my_mat.typeである()あなたのタイプのOpenCVのエンコーディングを提供します。適切な組み込み型で関数を呼び出すには、switch-caseが必要です。 Tl; dr; imreadのデフォルト値はCV_8UC3 – Miki
Btw、tl; dr; ) – Miki
しかし、my_mat.type()は実行時の型ですか?提供されたサンプルが正しく動作するため、コンパイラはコンパイル時に適切な型を見つけ出す必要があります。 – Scott