You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:57:27