Emgu 4.2中MemStorage与Contour类的位置及示例移植咨询
Emgu 4.2中MemStorage和Contour类的位置及移植建议
针对你移植旧示例到Emgu 4.2的需求,我整理了这两个类的变化和替代方案:
MemStorage类的位置
在Emgu 4.2中,MemStorage类依然在**Emgu.CV**命名空间下,你只需要在代码顶部添加:
using Emgu.CV;
并确保项目引用了Emgu.CV程序集,就能正常使用它。不过要注意,在4.x版本中,MemStorage的使用场景比旧版本少了很多——大部分API已经改用.NET风格的集合类型来存储数据,不再依赖它做临时存储。
Contour类的变化(重点)
这里要划重点:Emgu 4.x系列已经移除了旧版本的Contour类,改用更贴合.NET生态的容器类型来处理轮廓数据。具体来说:
- 单个轮廓的点集用
VectorOfPoint(来自Emgu.CV.Util命名空间)存储 - 多个轮廓的集合用
VectorOfVectorOfPoint存储
移植示例代码对比
旧版本(比如你参考的示例)可能会有类似这样的代码:
Contour<Point> contour = image.FindContours( Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, memStorage );
在Emgu 4.2中,你需要改成这样:
using Emgu.CV.Util; using Emgu.CV.CvEnum; // 初始化轮廓和层级结构的存储容器 VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); VectorOfVec4i hierarchy = new VectorOfVec4i(); // 调用新版FindContours方法 CvInvoke.FindContours( inputBinaryImage, // 注意输入要是二值化图像 contours, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxSimple, new Point(0, 0) ); // 遍历处理每个轮廓 for (int i = 0; i < contours.Size; i++) { VectorOfPoint singleContour = contours[i]; // 比如计算轮廓面积 double area = CvInvoke.ContourArea(singleContour); // 绘制轮廓到目标图像 CvInvoke.DrawContours(targetImage, contours, i, new MCvScalar(255, 0, 0), 2); }
额外注意事项
- 确保你引用了
Emgu.CV、Emgu.CV.Platform.NetStandard(如果是跨平台项目)等必要的程序集 - 旧示例中其他依赖
Contour的方法(比如轮廓逼近、外接矩形计算),都可以改用CvInvoke类下的静态方法配合VectorOfPoint来实现
内容的提问来源于stack exchange,提问作者user3314011
相关产品推荐
相关产品推荐

