Opencv,在编译时确定像素的类型
Opencv, figuring out the type of a pixel at compile time
tl;dr; 如何从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 语句调用特定的模板专用化。
例如,以下是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, "");
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 尝试渲染像素坐标时,简单线条渲染失败
- 计算另一个图像像素满足条件的像素值的平均值
- Opencv,在编译时确定像素的类型
- 读取的像素类型
- 垫子类型转换和访问单个像素时出现问题
- 为什么在访问矩阵中的像素时使用不同的数据类型会得到不同的值?