如何创建指定类型的Emgu::CV::Image?OpenCV CV_XX类型适配方法
在EmguCV中实现OpenCV的CV_XX类型矩阵创建
嘿,我来帮你捋捋EmguCV里怎么对应OpenCV那些CV_XX类型的矩阵。毕竟EmguCV是.NET封装的OpenCV,它用泛型来指定类型,和原生OpenCV的宏定义思路不太一样,这也是很多人一开始容易懵的点。
核心对应逻辑:EmguCV的泛型类型映射
EmguCV里主要用Image<TColor, TDepth>(用于图像)或者Matrix<TDepth>(用于通用矩阵)来对应OpenCV的Mat,其中:
- TColor:对应通道数和颜色空间,比如
Gray就是单通道(对应OpenCV里的C1后缀),Bgr是三通道(对应C3后缀) - TDepth:对应数据深度,直接映射OpenCV的CV_XX里的数字和类型:
byte→ 对应CV_8U(无符号8位整数)int→ 对应CV_32S(有符号32位整数)float→ 对应CV_32F(32位浮点数)double→ 对应CV_64F(64位浮点数)
举个例子,你提到的OpenCV里的CV_32SC1,在EmguCV里对应的就是单通道32位整数的容器,也就是Matrix<int>或者Image<Gray, int>。
针对你代码的修改建议
看你现在的代码创建了Image<Gray, byte>,但cvDistTransform(距离变换)通常需要输出浮点或者整数类型的结果,这可能就是你报错的原因。
如果需要创建对应CV_32SC1的容器,你可以这么写:
// 方式1:用Matrix<int>(通用矩阵类型) Emgu::CV::Matrix<int>^ tmp = gcnew Emgu::CV::Matrix<int>(gray->Size); // 方式2:用Image<Gray, int>(图像类型,和你原代码的容器类型更匹配) Emgu::CV::Image<Emgu::CV::Structure::Gray, int>^ tmp = gcnew Emgu::CV::Image<Emgu::CV::Structure::Gray, int>(gray->Size);
然后调用cvDistTransform的时候,要确保输入输出类型匹配,比如:
// 假设gray是Image<Gray, byte>类型,255-gray会自动转换为合适的输入类型 CvInvoke::cvDistTransform(255 - gray, tmp, Emgu::CV::CvEnum::DIST_TYPE::DIST_L2, 3);
常用类型映射对照表
我整理了个常用的对应表,你可以直接查:
- OpenCV
CV_8UC1→ EmguCVImage<Gray, byte>/Matrix<byte> - OpenCV
CV_32SC1→ EmguCVImage<Gray, int>/Matrix<int> - OpenCV
CV_32FC1→ EmguCVImage<Gray, float>/Matrix<float> - OpenCV
CV_64FC1→ EmguCVImage<Gray, double>/Matrix<double> - 多通道例子:OpenCV
CV_32SC3→ EmguCVImage<Bgr, int>/Matrix<int, 3>
额外报错排查小技巧
如果改完还是报错,不妨检查这几点:
- 输入和输出的图像/矩阵尺寸必须完全一致
cvDistTransform的参数是否正确(比如距离类型、掩码大小的取值范围)- 确保所有变量都正确初始化了,没有空引用的情况
内容的提问来源于stack exchange,提问作者GPPK
相关产品推荐
相关产品推荐

