人脸方向学习(三):人脸质量评价-人脸模糊检测总结二

人脸模糊检测实现流程

对采集到的人脸图像进行如下处理:
1.高斯模糊去噪,
2.转换灰度图,
3.在此图像上利用拉普拉斯算子滤波,
4.直方图归一化映射到0-255,
5.求均值,
检测方法:若该均值大于给定阈值,则认为是清晰照片,否则,是模糊照片。

bool blurDetect(Mat srcImage, double &blurPer){

    Mat srcBlur, gray1, gray2, gray3, dstImage; 
    double thre = 300; //控制阈值
    //pyrDown(srcImage, dstImage, Size(srcImage.cols/2, srcImage.rows/2));
    GaussianBlur(srcImage, srcBlur, Size(3, 3), 0, 0, BORDER_DEFAULT); //高斯滤波
    //imshow("sas", srcBlur);
    //imshow("ssas", srcImage);
    convertScaleAbs(srcBlur, srcImage); //使用线性变换转换输入数组元素成8位无符号整型 归一化为0-255
    if (srcImage.channels() != 1)  
    {  
        //进行灰度化  
        cvtColor(srcImage, gray1, CV_BGR2GRAY);  
    } else  
    {  
        gray1 = srcImage.clone();  
    } 

    Mat tmp_m1, tmp_sd1;    //用来存储均值和方差  
    double m1 = 0, sd1 = 0;  
    //使用3x3的Laplacian算子卷积滤波  
    //imshow("Lap千", gray1);
    //waitKey(0);
    Laplacian(gray1, gray2, CV_16S, 3, 1, 0, BORDER_DEFAULT);

    /*double minVal, maxVal;
    minMaxLoc(gray2, &minVal, &maxVal);
    double alpha = 255 / (maxVal - minVal), beta = -255 * minVal / (maxVal - minVal);*/

    归到0~255  
    convertScaleAbs(gray2, gray3);

    //imshow("Lap", gray3);
    //计算均值和方差  
    meanStdDev(gray3, tmp_m1, tmp_sd1);
    //imshow("Lap后", gray3);
    //waitKey(0);
    m1 = tmp_m1.at<double>(0, 0);     //均值  
    sd1 = tmp_sd1.at<double>(0, 0);       //标准差  
    //cout << "原图像:" << endl;  
    //cout << "均值: " << m1 << " , 方差: " << sd1*sd1 << endl; 
    blurPer = sd1*sd1; //方差
    //waitKey(0);
    if (blurPer < thre)  return 0;   
    else  return 1; 
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
人脸检测是一项复杂的任务,需要使用图像处理和计算机视觉技术。在C语言中实现人脸检测程序并不容易,但可以使用一些基本的图像处理技术来实现。 以下是一个简单的C语言人脸检测程序的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义图像宽度和高度 #define WIDTH 640 #define HEIGHT 480 // 定义像素点结构体 typedef struct { unsigned char r; unsigned char g; unsigned char b; } pixel_t; // 定义图像结构体 typedef struct { int width; int height; pixel_t *data; } image_t; // 加载图像 image_t *load_image(const char *filename) { FILE *fp = fopen(filename, "rb"); if (fp == NULL) { fprintf(stderr, "Cannot open file '%s'\n", filename); return NULL; } // 读取图像头信息 int width, height; fscanf(fp, "P6 %d %d 255", &width, &height); // 创建图像数据 image_t *image = (image_t*)malloc(sizeof(image_t)); image->width = width; image->height = height; image->data = (pixel_t*)malloc(width * height * sizeof(pixel_t)); // 读取图像像素数据 fread(image->data, 1, width * height * sizeof(pixel_t), fp); fclose(fp); return image; } // 保存图像 void save_image(const char *filename, image_t *image) { FILE *fp = fopen(filename, "wb"); if (fp == NULL) { fprintf(stderr, "Cannot open file '%s'\n", filename); return; } // 写入图像头信息 fprintf(fp, "P6\n%d %d\n255\n", image->width, image->height); // 写入图像像素数据 fwrite(image->data, 1, image->width * image->height * sizeof(pixel_t), fp); fclose(fp); } // 释放图像内存 void free_image(image_t *image) { free(image->data); free(image); } // 计算图像中某个像素的灰度值 unsigned char get_gray(pixel_t *pixel) { return (unsigned char)(0.3 * pixel->r + 0.59 * pixel->g + 0.11 * pixel->b); } // 对图像进行灰度化处理 void gray_scale(image_t *image) { for (int i = 0; i < image->width * image->height; i++) { unsigned char gray = get_gray(&image->data[i]); image->data[i].r = gray; image->data[i].g = gray; image->data[i].b = gray; } } // 对图像进行二值化处理 void binary(image_t *image) { for (int i = 0; i < image->width * image->height; i++) { unsigned char gray = get_gray(&image->data[i]); unsigned char value = gray > 128 ? 255 : 0; image->data[i].r = value; image->data[i].g = value; image->data[i].b = value; } } // 对图像进行高斯模糊处理 void gaussian_blur(image_t *image) { // TODO: 实现高斯模糊算法 } // 对图像进行腐蚀处理 void erode(image_t *image) { // TODO: 实现腐蚀算法 } // 对图像进行膨胀处理 void dilate(image_t *image) { // TODO: 实现膨胀算法 } // 检测人脸 void detect_face(image_t *image) { // TODO: 实现人脸检测算法 } int main(int argc, char *argv[]) { if (argc < 3) { fprintf(stderr, "Usage: %s input.ppm output.ppm\n", argv[0]); return 1; } // 加载图像 image_t *image = load_image(argv[1]); if (image == NULL) { return 1; } // 对图像进行灰度化处理 gray_scale(image); // 对图像进行二值化处理 binary(image); // 对图像进行高斯模糊处理 gaussian_blur(image); // 对图像进行腐蚀处理 erode(image); // 对图像进行膨胀处理 dilate(image); // 检测人脸 detect_face(image); // 保存图像 save_image(argv[2], image); // 释放图像内存 free_image(image); return 0; } ``` 这个示例程序使用PPM格式的图像文件作为输入和输出。它定义了一个图像结构体,包含图像的宽度、高度和像素数据。然后,它实现了一些基本的图像处理算法,如灰度化、二值化、高斯模糊、腐蚀和膨胀。最后,它调用一个人脸检测函数来检测图像中的人脸。你需要实现人脸检测算法来完成这个程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值