OpenCV中基于LBP算法的人脸检测测试代码

2023-10-30

        下面是OpenCV 3.3中基于CascadeClassifier类的LBP算法实现的人脸检测,从结果上看,不如其它开源库效果好,如libfacedetection,可参考 https://blog.csdn.net/fengbingchun/article/details/52964163 

#include "funset.hpp"
#include <string>
#include <vector>
#include <algorithm>
#include <opencv2/opencv.hpp>

namespace {

const std::string images_path_detect{ "E:/GitCode/Face_Test/testdata/detection/" };
const std::vector<std::string> images_name_detect{ "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg",
	"11.jpg", "12.jpg", "13.jpg", "14.jpg", "15.jpg", "16.jpg", "17.jpg", "18.jpg", "19.jpg", "20.jpg" };

void save_mats()
{
	const int width = 200, height = 200;
	cv::Mat dst(height * 5, width * 4, CV_8UC3);
	for (int i = 0; i < images_name_detect.size(); ++i) {
		std::string input_image = images_path_detect + "_" + images_name_detect[i];
		cv::Mat src = cv::imread(input_image, 1);
		if (src.empty()) {
			fprintf(stderr, "read image error: %s\n", input_image.c_str());
			return;
		}

		cv::resize(src, src, cv::Size(width, height), 0, 0, 4);
		int x = (i * width) % (width * 4);
		int y = (i / 4) * height;
		cv::Mat part = dst(cv::Rect(x, y, width, height));
		src.copyTo(part);
	}
	std::string output_image = images_path_detect + "result.png";
	cv::imwrite(output_image, dst);
}

} // namespace

int test_face_detect_LBP()
{
	const std::string lbp_files_path{ "E:/GitCode/Face_Test/testdata/lbpcascades/" };
	const std::vector<std::string> lbpcascades_files{ "lbpcascade_frontalface.xml", "lbpcascade_frontalface_improved.xml", "lbpcascade_profileface.xml" };

	cv::CascadeClassifier face_cascade(lbp_files_path+lbpcascades_files[0]);
	if (face_cascade.empty()) {
		fprintf(stderr, "classifier hasn't been loaded\n");
		return -1;
	}

	// Search for many objects in the one image.
	const int flags = cv::CASCADE_SCALE_IMAGE;
	// Smallest object size.
	const cv::Size min_feature_size = cv::Size(10, 10);
	// How detailed should the search be. Must be larger than 1.0.
	const float search_scale_factor = 1.1f;
	// How much the detections should be filtered out. This should depend on how bad false detections are to your system.
	// min_neighbors=2 means lots of good+bad detections, and min_neighbors=6 means only good detections are given but some are missed.
	const int min_neighbors = 2;
	const int scaled_width = 320;

	for (int i = 0; i < images_name_detect.size(); ++i) {
		std::string name = images_path_detect + images_name_detect[i];
		cv::Mat bgr = cv::imread(name, 1);
		cv::Mat gray = cv::imread(name, 0);
		if (!bgr.data || bgr.channels() != 3 || !gray.data || gray.channels() != 1) {
			fprintf(stderr, "read image fail: %s\n", name.c_str());
			return -1;
		}
		fprintf(stdout, "image name: %s: size(width, height): (%d, %d)\n", images_name_detect[i].c_str(), gray.cols, gray.rows);

		// possibly shrink the image to run much faster.
		cv::Mat resized, equalized;
		float scale = gray.cols / (float)scaled_width;
		if (gray.cols > scaled_width) {
			// Shrink the image while keeping the same aspect ratio.
			int scaled_height = cvRound(gray.rows / scale);
			cv::resize(gray, resized, cv::Size(scaled_width, scaled_height));
		} else {
			// Access the input image directly, since it is already small.
			resized = gray;
		}

		// standardize the brightness and contrast to improve dark images.
		cv::equalizeHist(resized, equalized);

		std::vector<cv::Rect> objects;
		// Detect objects in the small grayscale image.
		face_cascade.detectMultiScale(equalized, objects, search_scale_factor, min_neighbors, flags, min_feature_size);
		fprintf(stdout, "image name: %s: detect face count: %d\n", images_name_detect[i].c_str(), objects.size());

		// Enlarge the results if the image was temporarily shrunk before detection.
		if (gray.cols > scaled_width) {
			for (int j = 0; j < objects.size(); ++j) {
				objects[j].x = cvRound(objects[j].x * scale);
				objects[j].y = cvRound(objects[j].y * scale);
				objects[j].width = cvRound(objects[j].width * scale);
				objects[j].height = cvRound(objects[j].height * scale);
			}
		}

		for (int j = 0; j < objects.size(); ++j) {
			// Make sure the object is completely within the image, in case it was on a border.
			objects[j].x = std::max(objects[j].x, 0);
			objects[j].y = std::max(objects[j].y, 0);
			if (objects[j].x + objects[j].width > gray.cols) {
				objects[j].x = gray.cols - objects[j].width;
			}
			if (objects[j].y + objects[j].height > gray.rows) {
				objects[j].y = gray.rows - objects[j].height;
			}

			cv::rectangle(bgr, objects[j], cv::Scalar(0, 255, 0), 2);
		}

		std::string save_result = images_path_detect + "_" + images_name_detect[i];
		cv::imwrite(save_result, bgr);
	}

	save_mats();

	return 0;
} 

        检测结果如下:


GitHub: https://github.com/fengbingchun/Face_Test 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV中基于LBP算法的人脸检测测试代码 的相关文章

随机推荐

  • 来看21届IT学子应该如何备战秋招?

    写在前面 今天是2020年7月14 离正式秋招可能就两个月时间了 睡了个午觉醒来脑子里突然就在想怎样才能在秋招中找到一份满意的工作 决定把自己所想写下来 这篇文章写给自己同时也写给即将找工作的2021届各位幸运宝宝 一 有计划有目标的提高自
  • android项目迁移到androidX:类映射(android.arch.*)

    android arch core 支持库类 AndroidX 类 core executor AppToolkitTaskExecutor androidx arch core executor AppToolkitTaskExecuto
  • pytorch3d安装遇到的一些坑和解决过程

    最近为了安装pytorch3d 折腾了两天 足足两天 要注意 安装pytorch3d之前 必须先安装pytorch torchvision Pytorch3d官方 是建议用conda install的方式来安装 也可以用pip来安装 pip
  • 如何实现一个IAM系统

    IAM Identity and Access Management 的缩写 即 身份识别与访问管理 它提供单点登录 强大的认证管理 集中的授权和审计 帮助企业安全 高效地管理IT系统账号和资源权限 产品简介 赛赋Cipher IDaaS是
  • Pandas的read_excel函数学习

    excel表的读取在python中是非常重要的 为了方便今后的使用 我将我学习用python读取excel表的过程记录下来 以便今后回顾时能快速想起各种方法 下图为示例中使用的excel表中的内容 sheet1 学生的信息 sheet2 成
  • windows:ngix无法绑定80端口

    问题 cmd运行ngix提示 nginx emerg bind to 0 0 0 0 80 failed 10013 An attempt was made to access a socket in a way forbidden by
  • vue 默认选中复选框案例

  • JFrame的一些简单操作

    前几天在Java课上 老师有一段代码用到了Jframe和Jbutton这两个东西 起初我以为这是我们老师自己写的类 但是之后我一查发现这是Java中用于操控一个小窗口而封装的类 于是我去了解一下这个类 然后写了一个非常简陋的窗口 publi
  • 紫外光刻胶 AR-N 4400/电子束光刻胶 AR-N7700/AR-P617 电子束光刻胶

    光刻胶又称抗蚀剂 是指通过紫外光 电子束 离子束 射线等的照射或辐射 其性质发生变化的耐蚀刻薄膜材料 按曝光光源和辐射源的不同 又分为紫外光刻胶 包括紫外正性光刻胶 紫外负性光刻胶 深紫外光刻胶 电子束胶 射线胶 离子束胶等 AR N 44
  • 微信小程序框架——uni-app

    文章目录 uni app介绍 1 什么是uni app 2 上线的产品 3 uni app的社区和规模 uni app基础 1 uni app初体验 2 项目结构介绍 3 样式和sass 4 基本语法 5 事件 6 组件 7 生命周期 补充
  • python笔记:数组的一些操作

    目录 1 对数组求指数和对数 2 数组的最值及其索引 3 按照行或者列求均值 求和 最大值 最小值 标准差 方差 4 取对角线元素 5 取两个数组对应的最大或最小值 6 对数组重新排列 1 对数组求指数和对数 参考 指数 math exp
  • React.lazy懒加载组件

    1 React lazy的用法 React lazy方法可以异步加载组件文件 const Foo React lazy gt import componets ChildComponent React lazy不能单独使用 需要配合Reac
  • mysql关于mysql.server

    1 mysql server服务端工具 主要作用就是为了方便启动和关闭mysql服务 这个脚本中调用mysqld safe来启动mysqld 2 RPM包安装时 发现 etc rc d init d mysql和 usr share mys
  • 使用pip安装package的时候,如何不使用cache的文件,重新下载(防止package之间版本不匹配)

    我们在使用pip安装某一个package的时候 如果安装的有问题向卸载之后重新安装 卸载 pip uninstall mediapipe 重新安装 pip install mediapipe 但是 执行命令之后发现使用了cached的whe
  • CSerialPort教程4.3.x (2) - CSerialPort源码简介

    CSerialPort教程4 3 x 2 CSerialPort源码简介 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python Node
  • 位运算符介绍(二):Java位运算符

    Java语言提供了7个位操作运算符 这些运算符只能用于整型操作数 这些整数操作数包括long int short char和byte 这里注意 相对于C C Java多了一个位运算符 gt gt gt 整型操作数也多了一个byte类型 C
  • 【建议收藏】机器学习模型构建(一)——建模调参(内附代码)

    引言 在前一阶段的学习中 我们完成了数据预处理等上游操作 接下来就要开始进行模型的构建 构建模型 sklearn中提供各种机器学习模型的类供我们使用 我们要根据我们的业务逻辑进行相关的筛选进行构建调参 在本例中我将使用sklearn内置的数
  • 机器学习--特征选择(Python代码实现)

    转自 每日一Python 微信公众号 特征选择就是从原始特征中选取一些最有效的特征来降低维度 提高模型泛化能力减低过拟合的过程 主要目的是剔除掉无关特征和冗余特征 选出最优特征子集 常见的特征选择方法可以分为3类 过滤式 filter 包裹
  • 重磅:Kafka 迎来 1.0.0 版本,正式告别四位数版本号!

    Kafka 从首次发布之日起 已经走过了七个年头 从最开始的大规模消息系统 发展成为功能完善的分布式流式处理平台 用于发布和订阅 存储及实时地处理大规模流数据 来自世界各地的数千家公司在使用 Kafka 包括三分之一的 500 强公司 Ka
  • OpenCV中基于LBP算法的人脸检测测试代码

    下面是OpenCV 3 3中基于CascadeClassifier类的LBP算法实现的人脸检测 从结果上看 不如其它开源库效果好 如libfacedetection 可参考 https blog csdn net fengbingchun