c++ - Opencv,在编译时找出像素的类型

标签 c++ opencv matrix

tl;博士;如何从 cv::Mat my_mat = cv::imread("myfile.png") 获取编译时像素类型?

我有一个我编写的函数,它接受一个 Mat 迭代器:

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

我可以在不明确说明是什么的情况下使用这个函数 RAI是,因为我认为编译器能够在编译时弄清楚它是什么。

事实证明,我需要重构它以包含整个 Mat .但是,现在我不知道如何调用 do_stuff<T> , 因为我不知道如何弄清楚 T除了来自 iterator_traits我的矩阵迭代器类型,我不知道如何从我的代码中找出编译时矩阵迭代器类型,因为矩阵是用 imread 获得的,它似乎以某种方式神奇地在运行时设置了像素的类型。

最佳答案

OpenCV 查询 Mat.type() 值以确定底层像素类型,然后使用 if 或 switch 语句调用特定的模板特化。

例如,以下是 imgproc/src/floodfill.cppfloodfill.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, "");

关于c++ - Opencv,在编译时找出像素的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46982495/

相关文章:

c++ - 使用 ANDROID NDK 在 Cplusplus 中调用 ffmpeg1.2.1 时出现 "undefined reference to "

c++ - 提供指向成员本身的成员指针

c++ - 有什么方法可以将 vector<Point2f> 转换为 vector<Keypoint> 吗?

python - numpy协方差和协方差矩阵通过公式产生不同的结果

c++ - 线程安全的缓冲区数组

c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?

c++ - cvLoadImage 函数中的内存泄漏

opencv - 这种时差的原因是什么?

python - 如何使用循环而不是内置函数在 Python 中生成 Toeplitz 矩阵

Java ASCII 迷宫