3

我目前正在尝试使用 OpenCV 2.3 和 c++ 来检测手(戴着绿色手套),并区分不同的手势。

此时此刻,我的下一步是获取手的特定特征(凸缺陷)。

到目前为止,我已经在我的过程中使用了这些功能:

mixChannels(); //to subtract non-green channels from green. 
threshold(); //to convert to binary
erode(); dialate(); //to get rid of any excess noise
findContours(); //to find contours of course

这些工作非常出色,我已经能够findContours()通过使用drawContours().

下一步,这就是我所在的地方,是 using convexHull(),它也适用于 OpenCV 2.3。然而,我还没有弄清楚矢量结果的convexHull()实际外观(它们包含哪些特征)。

但这就是棘手的部分。

我发现旧版本的 OpenCV(使用 c which uses IplImage)有一个简洁的小函数cvConvexityDefects(),可以在凸包上给出一组缺陷。这些是我需要的,但 OpenCV 2.3 似乎没有这样的功能,我不知道如何使用旧语法来获得这些结果。

这是.Open CV 文档的链接cvConvextDefects

我要求的是类似的 OpenCV 2.3 函数,或者是用于查找这些缺陷的自写代码或算法。或者一种将旧的 2.1 语法用于矢量结果或类似的方法。

(我知道我可以使用其他特征,矩形边界框和拟合圆。但我确信凸缺陷会产生最可区分的特征。)

解决方案 - 我最终使用了这篇文章中的 c++ 包装器。这个包装器 唯一不起作用的似乎是缺陷向量的韭菜,它应该很容易解决。

下一步是从这些缺陷中获取一些可用数据。(乍一看。数据似乎是convexHull或Contour上的单点或这些的计数。我起初期望一组两个点,或一个点和一个长度,但它似乎不是.如果我用这个打“砖墙”,我会再发一篇文章)

4

2 回答 2

3

新的 C++ 接口(还)不支持 C 中的所有函数。反之亦然(并非 cpp 中的所有内容都在 c 中)。原因多种多样,但好消息是您可以轻松使用所需的任何功能。例如,在这里您必须将轮廓转换为序列 (CvSeq) 并将它们发送到您的函数。

此外,FindContours 方法是对 cvFindContours 的包装。你可以叫它

cvFindContours((IplImage*)matImage, ...);

然后直接使用结果。

另一种方法是在 cvConvexDefects() 上创建一个漂亮、干净的 C++ 包装器并将其提交给 OpenCV。在 findContours 源中,您会找到一些帮助(相反的变换)

于 2011-11-16T12:08:40.957 回答
2

我想尝试将我的 convexHull 向量从 c++ 语法转换为您提到的序列,但我不知道从哪里开始。您能否对此有所了解?

在这里查看这个问题,我相信它会涉及到它。

凸缺陷 C++ OpenCv

于 2011-11-17T18:21:45.420 回答