Face Detect base OpenCV

本文介绍了一种基于OpenCV的人脸检测方法,并详细解析了关键函数cvHaarDetectObjects的参数及其作用,通过示例代码展示了如何进行人脸检测。

1. Face Detect

待提取

2. Code

#include "FaceDetect.h"
using namespace std;
int main(void)
{
	// variables
	IplImage * pInpImg = 0;
	CvHaarClassifierCascade * pCascade = 0;  // the face detector
	CvMemStorage * pStorage = 0;        // memory for detector to use
	CvSeq * pFaceRectSeq;               // memory-access interface

	char ImageFilename[]="AKB48.jpg";

	// initializations
	pInpImg = cvLoadImage(ImageFilename, CV_LOAD_IMAGE_COLOR);
	pStorage = cvCreateMemStorage(0);
	pCascade = (CvHaarClassifierCascade *)cvLoad(("data/haarcascades/haarcascade_frontalface_default.xml"),0, 0, 0);

	// validate that everything initialized properly
	if (!pInpImg || !pStorage || !pCascade)
	{
		printf("Initialization failed: %s\n",
			(!pInpImg) ? "can't load image file" :
			(!pCascade) ? "can't load haar-cascade -- "
			"make sure path is correct" :
			"unable to allocate memory for data storage", ImageFilename);
		exit(-1);
	}

	pFaceRectSeq = cvHaarDetectObjects
		(pInpImg, pCascade, pStorage,
		1.1,                       // increase search scale by 10% each pass
		3,                         // merge groups of three detections
		CV_HAAR_DO_CANNY_PRUNING,  // skip regions unlikely to contain a face
		cvSize(200, 200), cvSize(300, 300));  // smallest size face to detect = 40x40,largest size face 使用默认;忽略;


	// display detected faces
	displayDetections(pInpImg, pFaceRectSeq);

	// clean up and release resources
	cvReleaseImage(&pInpImg);
	if (pCascade) cvReleaseHaarClassifierCascade(&pCascade);
	if (pStorage) cvReleaseMemStorage(&pStorage);

	return 0;
}


void displayDetections(IplImage * pInpImg, CvSeq * pFaceRectSeq)
{
	const char * DISPLAY_WINDOW = "Haar Window";
	int i;

	// create a window to display detected faces
	cvNamedWindow(DISPLAY_WINDOW, CV_WINDOW_AUTOSIZE);

	// draw a rectangular outline around each detection
	for (i = 0; i<(pFaceRectSeq ? pFaceRectSeq->total : 0); i++)
	{
		CvRect* r = (CvRect*)cvGetSeqElem(pFaceRectSeq, i);
		CvPoint pt1 = { r->x, r->y };
		CvPoint pt2 = { r->x + r->width, r->y + r->height };
		cvRectangle(pInpImg, pt1, pt2, CV_RGB(0, 255, 0), 3, 4, 0);
	}

	// display face detections
	cvShowImage(DISPLAY_WINDOW, pInpImg);
	cvWaitKey(0);
	cvDestroyWindow(DISPLAY_WINDOW);
}

效果如下:



3. Parameters and Tuning

CVAPI(CvSeq*)cvHaarDetectObjects( const CvArr* image,

                     CvHaarClassifierCascade*cascade, CvMemStorage* storage,

                     double scale_factor CV_DEFAULT(1.1),

                     int min_neighbors CV_DEFAULT(3),int flags CV_DEFAULT(0),

                     CvSize min_size CV_DEFAULT(cvSize(0,0)),CvSize max_size CV_DEFAULT(cvSize(0,0)));

 

MinimumDetection Scale

一般使用默认值,在data/haarcascades/*.xml中有定义,如haarcascade_frontalface_default.xml

<size> 24 24 </size>. 

可以根据需要将该参数设置的比默认值稍大些,可以使用包含人脸的输入图像的宽或高作对比进行修改;如1/4图像的宽。但是在修改时,需要保证此宽高比与默认保持一致,此处的宽高比为1:1。

 ScaleIncrease Rate

规定以多快的速度增加尺度从而在图像中检测人脸,该因子越高,检测的速度越快,但若过高,则会漏掉人脸。一般使用默认值1.1(10%);

Canny Pruning Flag

若设置为CV_HAAR_DO_CANNY_PRUNING,检测时,将略过不太可能包含人脸的区域,减少运算量;


### 如何使用 OpenCV 实现眼部化妆或滤镜效果 要通过 OpenCV 实现眼部化妆或滤镜效果,主要涉及以下几个方面的工作: #### 1. **面部检测与特征点提取** 为了精确定位眼睛的位置及其周围的关键点,可以借助 OpenCV 的 Haar Cascade 或者 dlib 库完成面部检测和关键点提取。这些工具可以帮助识别出人脸上的特定部位(如眼睛、眉毛等),从而为后续的眼部化妆操作奠定基础[^1]。 ```python import cv2 import dlib # 加载预训练模型用于脸部及关键点检测 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") def detect_eye_points(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = detector(gray) for face in faces: landmarks = predictor(gray, face) # 获取左眼和右眼的关键点坐标 (假设已知 landmark index 对应关系) left_eye_start, left_eye_end = 36, 41 right_eye_start, right_eye_end = 42, 47 points_left = [(landmarks.part(i).x, landmarks.part(i).y) for i in range(left_eye_start, left_eye_end + 1)] points_right = [(landmarks.part(i).x, landmarks.part(i).y) for i in range(right_eye_start, right_eye_end + 1)] return points_left, points_right return None, None ``` --- #### 2. **创建眼部遮罩层** 一旦获取到了眼睛的具体位置,就可以基于该数据构建一个掩码(mask)。此掩码会限定化妆效果仅作用于目标区域——即眼睛部分。接着,在这个区域内绘制所需的效果图样,比如涂抹眼影或者勾勒线条。 ```python def create_eye_mask(points, shape): mask = np.zeros(shape[:2], dtype=np.uint8) hull = cv2.convexHull(np.array(points)) cv2.fillConvexPoly(mask, hull, 255) return mask ``` --- #### 3. **叠加化妆品纹理** 最后一步就是把准备好的化妆品图案贴合到之前制作的蒙版之上,并适当调节其透明度以便自然融入原始照片之中。这通常涉及到 alpha 混合技术来控制新旧像素之间的过渡平滑性。 ```python def apply_makeup_effect(base_image, makeup_overlay, eye_mask): overlay_resized = cv2.resize(makeup_overlay, (base_image.shape[1], base_image.shape[0])) # 将遮罩转换成三通道形式匹配原图尺寸 eye_mask_color = cv2.merge([eye_mask]*3) result = np.where(eye_mask_color != 0, overlay_resized * 0.7 + base_image * 0.3 , base_image).astype('uint8') return result ``` 上述代码片段展示了如何加载外部素材作为装饰物并将其适配至指定的脸部器官上;同时运用简单的线性插值方法计算最终合成画面中的每一个像素值。 --- #### 结论 综上所述,利用 OpenCV 可以较为简便地达成模拟化粧品试戴的目的。不过值得注意的是实际开发过程中可能还需要考虑更多细节问题,例如不同肤色下的表现差异、光照条件变化的影响等等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值