2017-10-27 1 views
0

tl; dr; Wie bekomme ich den Kompilierzeit-Pixeltyp von cv::Mat my_mat = cv::imread("myfile.png")?Opencv, herauszufinden, die Art eines Pixels zum Zeitpunkt der Kompilierung

Ich habe eine Funktion, die ich geschrieben habe, die in einer Mat Iterator nimmt:

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()); 
} 

ich diese Funktion nutzen zu können, ohne explizit zu sagen, was RAI ist, weil ich denke, der Compiler ist in der Lage, um herauszufinden, was es zur Kompilierzeit ist.

Es hat sich herausgestellt, dass ich dies umgestalten muss, um das ganze aufzunehmen. Jedoch kann ich jetzt nicht herausfinden, wie ich do_stuff<T> aufrufen kann, weil ich nicht weiß, wie T außer iterator_traits meines Matrix-Iteratortyps herauszufinden ist, und ich weiß nicht, wie die Kompilierzeit herauszufinden Matrix-Iterator-Typ aus meinem Code, da die Matrix mit einem imread, die den Typ für Pixel zur Laufzeit irgendwie magisch zu setzen scheint bekommen.

+0

my_mat.type() gibt Ihnen die OpenCV-Codierung des Typs. Sie benötigen einen Schalter, um Ihre Funktion mit dem richtigen eingebauten Typ aufzurufen. Tl; dr; der Standard für das Lesen ist CV_8UC3 – Miki

+1

Btw, tl; dr; sollte an die Spitze gesetzt werden;) – Miki

+0

aber my_mat.type() ist ein Laufzeittyp? Irgendwie muss der Compiler zur Kompilierzeit die passenden Typen herausfinden, weil das mitgelieferte Beispiel korrekt funktioniert. – Scott

Antwort

1

OpenCV fragt den Wert Mat.type() ab, um den zugrunde liegenden Pixeltyp zu bestimmen, und verwendet dann eine if- oder switch-Anweisung, um eine bestimmte Vorlagenspezialisierung aufzurufen.

Zum Beispiel sind hier ein paar Schnipsel von floodfill.cpp in 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, ""); 
Verwandte Themen