我目前正在尝试使用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()
。
下一步,这就是我所使用的convexHull()
,它也适用于OpenCV 2.3。然而,我还没有找到convexHull()
的矢量结果实际上是什么样的(它们包含哪些特征)。
但这是棘手的部分。
我发现旧版本的OpenCV(使用c使用IplImage
),有一个简洁的小函数叫cvConvexityDefects()
,它可以给凸包带来一系列缺陷。这些是我需要的,但OpenCV 2.3似乎没有这样的功能,我也看不出如何使用旧语法来获得这些结果。
这是一个link to Open CV documentation on cvConvextDefects
。
我要求的是,类似的OpenCV 2.3功能,或用于发现这些缺陷的自写代码或算法。或者将旧的2.1语法用于矢量结果或类似的方法。
(我知道我可以使用其他功能,矩形边框和装配圆圈。但我确信凸缺陷会产生最明显的特征。)
解决方案 - 我最终使用来自this post的c ++包装器 唯一不适用于这个包装器的东西似乎是缺陷向量的韭菜,应该很容易解决。
下一步是从这些缺陷中获取一些可用的数据。 (乍一看。数据似乎是在convexHull或Contour上的单点或者这些数据。我起初预计会有一组两个点,或者一个点和一个长度,它似乎不是如果我用这个打“砖墙”,我会另外发帖子)
答案 0 :(得分:3)
新的C ++接口(尚未)支持C中的所有函数。反过来也是如此(cpp中的所有内容都不在c中)。原因很多,但好消息是你可以轻松使用你想要的任何功能。例如,在这里你必须将轮廓转换为序列(CvSeq)并将它们发送到你的函数。
此外,FindContours方法是cvFindContours的包装器。你可以称之为
cvFindContours((IplImage*)matImage, ...);
然后直接使用结果。
另一种方法是在cvConvexDefects()上创建一个漂亮,干净的C ++包装器并将其提交给OpenCV。在findContours源代码中,您将找到一些帮助(相反的转换)
答案 1 :(得分:2)
我想尝试将我的convexHull向量从c ++语法转换为你提到的序列,但我不知道从哪里开始。你能否对此有所了解?
在这里查看这个问题,我相信它会进入它。