使用 OpenCV Mat 作为数组:VB vs C++

Using OpenCV Mat as an Array: VB vs C++

我正在使用 VS2015、EmguCV 3 和 VB,并且正在尝试翻译一些 C++ 代码。

C++

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
for (size_t i = 0; i < contours.size(); ++i)
{...}

我正在尝试使用完整给出的一些面向对象代码 here。基本上,代码会告诉我图像中对象的朝向角度。不幸的是,它是 C++ 代码,VB 开发人员的大脑在看到一些 C++ 语法时可能会爆炸。欢迎任何帮助避免再次清洁我的屏幕的帮助。在这种特殊情况下,爆炸性的 material 是 vector<vector<point> > contours;,我的问题是如何翻译它。

我走到这一步:

VB

Imports Emgu.CV
Imports Emgu.CV.Structure
...
contours = New Mat
hierarchy = New Mat
CvInvoke.FindContours(m, contours, hierarchy, CvEnum.RetrType.List, CvEnum.ChainApproxMethod.ChainApproxNone)

我正在使用 EmguCV 3。这声称 FindContours 需要 image As IInputOutputArray, contours As IOutputArray, hierarchy As IOutputArray。所以我想我可以提供三个垫子。之前定义的 m 已成功处理(例如使用阈值),所以我对 m 很满意。另一方面,轮廓和层次结构可能有问题。当我 运行 代码时,我得到一个未处理的异常:

Emgu.CV.Util.CvException: OpenCV: (_contours.kind() == _InputArray::STD_VECTOR_VECTOR || _contours.kind() == _InputArray::STD_VECTOR_MAT || _contours.kind() == _InputArray::STD_VECTOR_UMAT)

这似乎表明我向 OpenCV 传递了错误的类型,尽管我本以为 Emgu 会处理这个问题。但我不知道。有帮助吗?

基于 Documentation 和 VB 部分:

"contours Type: Emgu.CV.IOutputArray -> Detected contours. Each contour is stored as a vector of points."

因此,与其发送单个 MAT 作为您的 contours,您应该发送一个包含点向量的容器。

看这里The Equivalent of C++ Vectors for VB.Net