#include<opencv2/opencv.hpp>
#include <iostream>
#include<string>
using namespace cv;
using namespace std;
/**********************************
* src:是输入的图片
* vector是可以表示一个动态的数组描述的数组的大小不固定
* Rect:矩形
*
***********************************/
bool Mosaic(Mat &src,vector<Rect> &face)
{
if(src.empty())
{
return false;
}
int step=10;//定义一个步长
for(int t=0;t<face.size();t++)
{
//获取第一张脸的坐标
int x=face[t].tl().x;
int y=face[t].tl().y;
int width=face[t].width;
int height=face[t].height;
//进行切块
for (int i = y; i < y+height; i+=step)
{
for(int j=x;j<x+width;j+=step)
{
//针对每一块进行像素处理
for (int k= i; k < i+step; k++)
{
for(int m=j;m<j+step;m++)
{
//对矩形区域进行像素修改
for(int c=0;c<3;c++)//每个颜色都是有RGB这三种颜色表示出来的
{
src.at<Vec3b>(k,m)[c]=src.at<Vec3b>(i,j)[c];
}
}
}
}
}
}
return true;
}
//void TestMosaic(Mat &src)
//{
// vector<Rect> face;//储存每张脸的每一个像素点
//face.push_back(Rect(100,100,200,200));
//face.push_back(Rect(300,300,200,200));
//Mosaic(src,face);
//}
/****************************************
* 针对图片进行人脸识别
*/
/*
bool pictureDemo(Mat src)
{
string file="haarcascade_frontalface_alt.xml";
CascadeClassifier object;
object.load(file);
vector<Rect> face;
object.detectMultiScale(src,face,1.1,5);
if(!Mosaic(src,face))
{
return false;
}
imshow("face finding",src);
waitKey(0);
return true;
}
*/
void VideoToImg()
{
VideoCapture cap=VideoCapture(0);//将摄像头捕获的放在cap中
if(!cap.isOpened())
{
printf("打开失败\n");
return ;
}
Mat image;
int i=1;
while(1)
{
cap >>image ;//用cpp的溢出把这个cap中的一帧拿出来
if(image.empty())
break;
imshow("image",image);
char userKey=waitKey(10);
if (userKey==27)
{
break;
}
}
}
bool videoDemo()
{
string file="haarcascade_frontalface_alt.xml";
CascadeClassifier object;
object.load(file);
vector<Rect> face;//存储人脸信息
VideoCapture cap=VideoCapture(0);
if(!cap.isOpened())
{
printf("摄像头打开失败\n");
return false;
}
Mat image;
while(cap.read(image))
{
flip(image,image,1);//一帧一帧的切割
vector<Rect> face;
object.detectMultiScale(image,face,1.1,5);
if(Mosaic(image,face))
{
imshow("face Mosaic",image);
}
char userKey=waitKey(10);
if (userKey==27)
{
break;
}
}
}
int main()
{
Mat img=imread("3.jpg");
// Mat imgResize;
// resize(img,imgResize,Size(),0.5,0.5);
//namedWindow("face finding",WINDOW_AUTOSIZE);
// pictureDemo(imgResize);
videoDemo();
//imshow("face finding",imgResize);
}
opencv4.5 c++人脸识别加马赛克
最新推荐文章于 2024-07-04 11:10:43 发布