OpenCV (C++) 中的向量比较
Posted
技术标签:
【中文标题】OpenCV (C++) 中的向量比较【英文标题】:Vector comparison in OpenCV (C++) 【发布时间】:2014-04-21 21:31:19 【问题描述】:我需要编写一个 OpenCV 程序,从摄像头提要中的几个人中检测出一个人穿着一件带有徽标的特定 T 恤。
我可以使用 SURF 来检测 logo 和 HOGDescriptor 来检测人。
然后我可以检查徽标的边界框的角是否在绑定人的矩形的角内。
标志的角存储在:
std::vector< Point2f > scene_corners(4);
人周围的矩形的角存储使用:
cv::Rect r = found[i];
我需要做以下比较:
if(scene_corners[0]>=r.tl() && scene_corners[2]<=r.br())
其中 r.tl() 和 r.br() 是矩形的角。
这不起作用,我猜是因为操作数不兼容。我该如何进行比较?提前致谢。
【问题讨论】:
您的问题是什么?看起来您已经编写了所需的代码。您“比较”的目标是什么? 我应该检测出穿着带有特定徽标的 T 恤的人。因此,我检测到人,然后检查徽标是否存在于该人的边界矩形内,并且仅当该徽标存在于其中时才绘制矩形。上面给出的“if”条件是无效的,因为操作数是不同的类型。我不知道该怎么做。谢谢! 【参考方案1】:正如您所发现的,>=
运算符并未针对 cv::Point
实例实现。你可以做的是构造一个cv::Rect
代表人的边界框。然后使用Rect::contains()
方法来测试你的每个内在点。这应该符合您的比较标准。
// I assume that index 0 is top-left and index 2 is bottom-right
cv::Rect person_bounds(scene_corners[0], scene_corners[2]);
if (person_bounds.contains(r.tl()) && person_bounds.contains(r.br()))
// do something...
【讨论】:
【参考方案2】:正如@Aurelius 指出的那样,>=
或<=
运算符未针对cv::Point
实例实现。在比较之前你需要先把它的数据拿出来。
你可以简单地使用:
if(scene_corners[0].x>=r.tl().x && scene_corners[0].y>=r.tl().y
&& scene_corners[2].x<=r.br().x && scene_corners[2].y<=r.br().y)
// ...
【讨论】:
以上是关于OpenCV (C++) 中的向量比较的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OpenCV 将向量的结构复制到 C++ 中的另一个向量
OpenCV C++:根据存储在 int 向量中的索引为 Mat 类型数据创建列范围