c++ - 面部轮廓被检测为具有相同绘图的 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 图像上绘制两个轮廓,它们显示相同的轮廓。
解决方案
这是因为您使用的检索模式。您选择了RETR_TREE
模式来查找轮廓。正如文档所说:
CV_RETR_TREE 检索所有轮廓并重建嵌套轮廓的完整层次结构
它同时发现内部和外部轮廓,这就是它检测到 2 个轮廓的原因。在您的情况下使用RETR_EXTERNAL
模式可能会更好:
CV_RETR_EXTERNAL 仅检索极端外部轮廓。
推荐阅读
- php - sqlite3 和 pdo_sqlite 未在 php apache2 localhost 中加载,但在 php cmd 窗口中加载
- sed - 从Unix中的文件中删除带有子字符串的行
- angular - 表的 cdk-virtual-scroll-viewport 未正确显示搜索结果
我试图对具有大数据大小的表使用虚拟滚动选项。当我使用它时,它会正确显示滚动条。但是由于想要启用搜索,我使用了“table datatable”。但它没有正确显示搜索结果。如何解决问题?
<cdk-virtual-scroll-viewport [itemSize] = "20"> <table datatable >
- c# - 在 iframe 中使用 RedirectToAction 后,ASP.NET MVC 会话被重置
- sql - 如何将json解析为行而不是列?
- jquery - 如何在不使用 Shopify 中的任何应用的情况下添加使用 google 或 facebook 登录?
- php - 如何在moodle中显示统计数据?
- swift - 如何在特定视图控制器中使用默认动画更改 UINavigationController 导航栏背景颜色
- javascript - Firestore:动态更新文档(网络)
- docker - 管理用于 docker 构建的本地/私有 Golang 包和模块