首页 > 解决方案 > 面部轮廓被检测为具有相同绘图的 2 个轮廓

问题描述

我正在做一个关于人脸检测的项目,到目前为止,我想将人脸检测为一个完整的轮廓,但事实并非如此。

我有以下内容:

std::vector<std::vector<cv::Point>> biggestcontours;
Mat canny_output;
        vector<Vec4i> hierarchy;
        Rect bounding_rect;

        /// Detect edges using canny
        Canny(src, canny_output, thresh, thresh * 2, 3);
        /// Find contours
        findContours(canny_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++)
        {
            approxPolyDP(contours[i], contours_poly[i], 3, true);
            boundRect[i] = boundingRect(contours_poly[i]);
            contour_sizes.push_back(contours[i].size());
            drawContours(drawing_all, contours, i, Scalar(255, 255, 255));
        }
std::sort(contour_sizes.begin(), contour_sizes.end());

        for (int i = 0; i < contours.size(); i++)
        {
            if (contours[i].size() == contour_sizes[contour_sizes.size() - 1] || contours[i].size() == contour_sizes[contour_sizes.size() - 2]
                || contours[i].size() == contour_sizes[contour_sizes.size() - 3])
            {
                if (contours[i].size() < 300) continue;
                biggestcontours.push_back(contours[i]);
                rectangles.push_back(boundRect[i]);
                drawContours(drawing_biggest_3, contours, i, Scalar(255, 255, 255));
                rectangle(drawing_biggest_3, boundRect[i].tl(), boundRect[i].br(), Scalar(150, 100, 255), 2);
            }
        }
nbcontours = biggestcontours.size();
        stringstream ss;
        ss << nbcontours;
        string str = ss.str();
        putText(drawing_biggest_3, str, cv::Point(30, 30),
            FONT_HERSHEY_COMPLEX_SMALL, 0.8, Scalar(200, 200, 250), 1, cv::LINE_AA);

最大轮廓向量在每一帧都被清除(biggestcontours.clear())。当我显示我的脸时,轮廓数被检测为 2,但我的脸显示出清晰的轮廓,没有分离。我尝试在单独的 Mat 图像上绘制两个轮廓,它们显示相同的轮廓。

标签: c++opencv

解决方案


这是因为您使用的检索模式。您选择了RETR_TREE模式来查找轮廓。正如文档所说:

CV_RETR_TREE 检索所有轮廓并重建嵌套轮廓的完整层次结构

它同时发现内部和外部轮廓,这就是它检测到 2 个轮廓的原因。在您的情况下使用RETR_EXTERNAL模式可能会更好:

CV_RETR_EXTERNAL 仅检索极端外部轮廓。


推荐阅读