在这个 openCV 循环中,“faces.size()”是啥意思?

Posted

技术标签:

【中文标题】在这个 openCV 循环中,“faces.size()”是啥意思?【英文标题】:What does 'faces.size()' mean in this openCV loop?在这个 openCV 循环中,“faces.size()”是什么意思? 【发布时间】:2016-05-13 22:43:38 【问题描述】:

我正在尝试自学 opencv 和 c++,而用于面部和眼睛检测的 example program 包括以下行:

for(size_t i = 0; i < faces.size(); i++)

我不明白 faces.size() 是什么意思,从那以后 i 可以大于 faces.size()。

它是如何获取数值的?

我在程序的其余部分中看到了很多人脸实例,但我唯一一次看到大小是作为 face_cascade.detectMultiScale 的参数。不过它是大写的,这让我觉得它与 faces.size() 无关。

【问题讨论】:

faces 肯定是某种类型的容器的实例(即std::vectorstd::map),size 只是返回它当时持有的元素数量。如果你对容器感到困惑,我建议你看看@en.cppreference.com/w/cpp/container OpenCV 不是开始学习 C++ 的好地方。从没有任何第三方库的 C++ 和 a good book or two 开始。掌握 C++ 的基础知识,然后开始解开 OpenCV @WhozCraig,对于一个像泥巴一样清晰的人来说——冒号是干什么用的?什么是性病? 的东西是干什么用的?那是声明吗?什么声明?等等…… 这是一个棘手的问题,@LamarLatrell。我们必须在这里做出的基本假设是提问者具有一定的最低知识;否则所有答案都必须以“一开始……”开头。因此,C++ 文本的前几章需要禁止使用,除非有针对性的问题,这些问题无需先涵盖C++ 文本的前几章。 我同意。我不认为将 any 框架混入其中是学习 C++ 的好方法。很多时候,你的注意力从理解和学习语言转移到只学习框架。这很糟糕,因为您最终会错过 很多 的东西,并且您的语言能力会受到影响。如果您对学习语言很认真,请放弃使用 OpenCV,拿起一本好书,然后开始学习。否则,任何教育您有关该语言的努力充其量都是徒劳的。 【参考方案1】:
faces.size()

返回“面孔”的大小,即“面孔”中有多少面孔。

一般来说,基本的 for 循环结构如下:

for ( init; condition; increment )

   //your code...

只要条件为真,它就会运行,即只要 'i' 小于 faces.size()(可能是 '10' 或其他整数值)。

'i' 将变得更大,因为每个循环迭代都将 1 添加到其中。这由 i++ 指令管理。

如果您正在为循环语法而苦苦挣扎,那么 openCV 可能不是开始学习 C++ 的最佳场所,因为许多示例期望的能力水平高于“初学者”(有意或无意地通过简单的坏编码/缺乏评论等)

【讨论】:

【参考方案2】:

faces 正在这里填充:

//-- Detect faces
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );

根据OpenCV documentation:

void cv::CascadeClassifier::detectMultiScale    (   InputArray      image,
        std::vector< Rect > &   objects,
        double      scaleFactor = 1.1,
        int     minNeighbors = 3,
        int     flags = 0,
        Size    minSize = Size(),
        Size    maxSize = Size() 
    )   

std::vector&lt; Rect &gt; &amp; objects(在你的情况下是面孔)是一个

矩形向量,其中每个矩形包含检测到的 对象,矩形可能部分位于原始图像之外。

如您所见,objects 是 passed by reference 以允许在函数内部对其进行修改。

std::vector&lt;Type&gt;::size() 也会给你向量的大小,所以,i&lt;faces.size() is necessary to get the index i inside the bounds of the vector

【讨论】:

以上是关于在这个 openCV 循环中,“faces.size()”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中循环遍历 16 位 Mat 像素的有效方法

尝试使用 OpenCV 查找特定范围内的像素(使用 for 循环)

在 Java 绑定中循环遍历 OpenCV Mat

在 OpenCV 中存储图像和指针

在 Tkinter 主循环期间录制 OpenCV 视频

为啥我在嵌套的 for 循环中分配 OpenCV Mat 对象后不包含预期值?