视频帧人脸检测 (I)

简介:

这个是用前后帧对比的方式进行的人脸检测,因为之前用的视频单帧图片进行人脸检测的效果有限,所以企图能通过其他手段优化视频人脸检测的处理。

我现在的思路就是先尽量精确的检测出人的范围(外接矩形),然后只在这个范围里面人脸检测,这样就可以提高误判率


老师要求的时间限制是2周内,这个时间有一点点紧了,虽然这个项目我觉得不难,但是中途遇到的问题是不可预知的。。。

这段代码存在一个问题,就是用膨胀操作的时候,如果核太大,计算量会陡增,甚至比单帧处理的还慢。。。所以问题必须解决膨胀问题,不能只用膨胀来形成连通域

而且中值滤波的效率也不高


解决的思路大致有一些了,就是先对整个图片轮廓检测,去掉小面积的,然后再小核膨胀试试


先贴出待修改的facedetect2.cpp的代码:

//opencv2.0风格

#include "cv.h"
#include "highgui.h"

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

#include <iostream>
#include <cstdio>

using namespace std;
using namespace cv;


int main()
{
	Mat frame;		//每一帧图像
	Mat gray;		//frame转成的灰度图
	Mat frame_copy_8U;	//copy过来的8U图像
	Mat img1;		//差分输出
	Mat outBinary; //二值图输出
	Mat outDilated;//膨胀输出

	//获取自定义核
	Mat elementDilated = getStructuringElement(MORPH_RECT, Size(200, 200));

	int nThreshold; //二值化阈值
	char* input_name = "001.avi";


	//从视频读入
	VideoCapture capture(input_name);

	cvNamedWindow( "result", 1 );

	if(capture.isOpened()/*capture*/)	// 摄像头读取文件开关
	{
		//对每一帧做处理

		for(;;)
		{
			capture >> frame;

			if(!frame.empty())//如果捕捉到了
			{ 
				//frame->gray 单通道灰度图
				cvtColor(frame, gray, CV_BGR2GRAY);

				//进行处理
				if (frame_copy_8U.empty())
				{
					//记录第一帧 gray->frame_copy
					gray.convertTo(frame_copy_8U, CV_8U);
				}

				//差分
				absdiff(frame_copy_8U, gray, img1);

				//二值化
				nThreshold=30;
				threshold(img1, outBinary, nThreshold, 255, THRESH_BINARY);

				//中值滤波
				cv::medianBlur(outBinary, outBinary, 5);


				//进行膨胀操作
				dilate(outBinary,outDilated, elementDilated);


				imshow("resultPre", outDilated);

				//轮廓检测
				vector<vector<Point>> _contours;//储存所有轮廓
				vector<Vec4i>hierarchy;

				Mat imageROI;;
				cv::findContours( outDilated, _contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

				double area_threshold = 0;

				for(size_t i = 0; i< _contours.size(); ++i)
				{
					//遍历所有轮廓

					//获得外接矩形
					Rect r0 = boundingRect(Mat(_contours[i]));
					//计算轮廓面积
					double contArea =  fabs(contourArea(_contours[i]));

					cout<<contArea<<endl;
					cout<<"x == "<<r0.x<<endl;
					cout<<"y == "<<r0.y<<endl;

					rectangle(outDilated,r0,cvScalar(255,255,255),1,8,0);

					//去除较小面积的轮廓
					/*if( contArea < area_threshold)
						continue;*/

				}

				cout<<"\n\n*************************************"<<endl;

				imshow("src", frame);
				imshow("result", outDilated);

			}

			else
			{ 
				printf(" --(!) No captured frame -- Break!");
				break;
			}

			//10ms中按任意键进入此if块
			if( cvWaitKey( 10 ) >= 0 )
				break;
		}
	}

	return 0;
}





相关文章
|
6月前
|
机器学习/深度学习 算法 计算机视觉
yolov8人脸识别-脸部关键点检测(代码+原理)
yolov8人脸识别-脸部关键点检测(代码+原理)
|
5月前
|
算法 计算机视觉 Python
SIFT关键点检测
【6月更文挑战第5天】SIFT关键点检测。
34 4
什么是音频降噪处理中的降噪强度参数
什么是音频降噪处理中的降噪强度参数
|
6月前
|
机器学习/深度学习 文字识别 算法
MATLAB图像倾斜校正算法实现:图像倾斜角检测及校正
MATLAB图像倾斜校正算法实现:图像倾斜角检测及校正
|
计算机视觉 索引
02 OpenCV图像通道处理
在数字图像处理中,图像通道是指一个图像中的颜色信息被分离为不同的颜色分量。常见的图像通道包括RGB通道、灰度通道、HSV通道等。 RGB通道是指将图像分离为红色、绿色和蓝色三个颜色通道,每个通道表示相应颜色的亮度。这种方式是最常见的方式,它对于彩色图像的处理非常重要。
|
6月前
|
计算机视觉
图像降噪方法:
图像降噪方法: 图像降噪是图像处理中的一项重要任务,可以通过减少图像中的噪声来提高图像的质量。常见的降噪方法包括: - 均值滤波:对图像中的每个像素取平均值,降低噪声。 - 中值滤波:对图像中的每个像素取邻域内像素的中值,降低脉冲噪声和椒盐噪声。
314 1
|
机器学习/深度学习 人工智能 算法
OpenCV-差分法实现绿叶识别(图像差分+颜色通道)
OpenCV-差分法实现绿叶识别(图像差分+颜色通道)
175 0
|
机器学习/深度学习 传感器 算法
【图像检测-人脸检测】基于深度学习的人脸检测和面部标志定位附matlab代码
【图像检测-人脸检测】基于深度学习的人脸检测和面部标志定位附matlab代码
|
存储 计算机视觉
第5讲 相机与图像
第5讲 相机与图像
122 0
第5讲 相机与图像
|
计算机视觉
论如何减少降噪导致图像失真
论如何减少降噪导致图像失真
369 0