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】:

正如您所发现的,&gt;= 运算符并未针对 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 指出的那样,&gt;=&lt;= 运算符未针对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++ 中的另一个向量

c++和opencv中的向量下标超出范围错误

OpenCV C++:根据存储在 int 向量中的索引为 Mat 类型数据创建列范围

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?

向量下标超出范围opencv c++

SVM支持向量机回归openCv c++