人脸检测并打码的关键,首先需要定位人脸区域,再修改人脸区域像素灰度值。
一 定义马赛克函数
定义生成马赛克函数 Generate_Mosaic,对图形 Mat& src 做操作,将需要操作的块(faces)存入数组 vector<Rect>& faces 中(<Rect>表示用矩形区域描述)。
src:代表马赛克效果的图片; faces:显示马赛克的区域; Rect:矩形区域(x,y,w,h)
马赛克函数思想过程:定义马赛克大小为10像素,int step = 10。for (int t = 0; t < faces.size(); t++) 对每一张脸进行马赛克操作。再确定 faces 所在区域(x, y, w, h),然后针对 faces 所在进行马赛克处理。10像素的矩形遍历人脸矩形框区域像素,再将矩形框细分成若干个小方块,依次修改每个方块的像素,相同方块赋予相同灰度值。
src.at<Vec3b> (k, m)[c] (<Vec3b>原图的颜色, 位置(k, m),[C]颜色值)
bool Generate_Mosaic(Mat& src, vector<Rect>& faces)
{
if (faces.empty())return false;
int step = 10;//步长
for (int t = 0; t < faces.size(); t++)
{
int x = faces[t].tl().x; //人脸矩形框起点x坐标
int y = faces[t].tl().y;//人脸矩形框起点y坐标
int width = faces[t].width;//人脸矩形框宽
int height = faces[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 < (step + i); k++)
{
for (int m = j; m < (step + j); m++)
{
//对矩形区域像素值进行修改,rgb三通道
for (int c = 0; c < 3; c++)
{
src.at<Vec3b>(k, m)[c] = src.at<Vec3b>(i, j)[c];
}
}
}
}
}
}
return tru