admin管理员组

文章数量:1618698

刚做完的一个项目来记录一下,方便日后复习。

这个项目主要实现的功能就是首先通过人脸识别来确定电脑屏幕前是否有人,有的话就在进行进一步不的瞳孔检测来判别是否人在看屏幕,是的话就进一调节屏幕亮度到指定人眼舒适值,否则的话就调暗亮度,以此来达到节能减排的目的。

程序的思路如下:

 由于代码量较大,我接下来就主要讲解最核心的部分(想要源码的可以点赞关注后评论,我给你发邮箱)。在人脸识别上网络设计上,设计卷积层的输出为32个通道,卷积核的大小是3*3,激活函数为relu,池化层的大小是2*2,损失函数为交叉熵函数,在瞳孔检测上调用了opencv的faverecognize库,实现瞳孔的标定和检测。

由于项目要实现不仅是屏幕亮度的调节,还要实现舒适值来保护眼睛,所以也涉及色温的调节,色温的调节的话用C++语言设计了RGB转temperature的算法,在读取摄像头的图像,分割图像的RGB三个通道并保存在容器中,最后根据研究的结果改变每一个通道的像素值,最后在合并图像。具体实现如下:

void QtSightness::kttoRGB()
{
    int temperature = 8500;
    float ktRGB_Temperature = temperature / 100;

    Mat ktoRGB_red, ktoRGB_green, ktoRGB_blue;
    Mat input, result, output;
    VideoCapture cap(0);
    cap >> input;

    vector<Mat>mv;
    split(input, mv);
    ktoRGB_red = mv[2];
    ktoRGB_blue = mv[0];
    ktoRGB_green = mv[1];


    if (ktRGB_Temperature <= 66)
    {
        ktoRGB_red = 255;
    }
    else {
        ktoRGB_red = 329.698727446 * pow(ktRGB_Temperature - 60, -0.1332047592);

        for (int i = 0; i < ktoRGB_red.rows; i++) 
        {
            for (int j = 0; j < ktoRGB_red.cols; j++) 
            {
                if (ktoRGB_red.at<uchar>(i, j) < 0) {
                    ktoRGB_red.at<uchar>(i, j) = 0;
                }
                else if (ktoRGB_red.at<uchar>(i, j) > 255)
                {
                    ktoRGB_red.at<uchar>(i, j) = 255;
                }
         }

            }
        }
    }
    
  
        //green
      if (ktRGB_Temperature <= 66)
      {
        ktoRGB_green = 99.4708025861 * log(ktRGB_Temperature) - 161.1195681661;
      }
      else
      {
        ktoRGB_green = 288.1221695283 * pow(ktRGB_Temperature - 60, -0.0755148492);

      }
           for (int i = 0; i < ktoRGB_green.rows; i++) 
           {
                for (int j = 0; j < ktoRGB_green.rows; j++) 
                {
                    if (ktoRGB_green.at<uchar>(i, j) < 0) 
                    {
                        ktoRGB_green.at<uchar>(i, j) = 0;
                    }
                    else if (ktoRGB_green.at<uchar>(i, j) > 255)
                    {
                        ktoRGB_green.at<uchar>(i, j) = 255;
                    }
                }
           }
      
        if (ktRGB_Temperature >= 66)
        {
            ktoRGB_blue = 255;
        }
        else
        {
            if (ktRGB_Temperature <= 19)
            {
                ktoRGB_blue = 0;
            }
            else
            {
                ktoRGB_blue = 138.5177312231 * log(ktRGB_Temperature - 10) - 305.0447927307;
                for (int i = 0; i < ktoRGB_blue.rows; i++) {
                   for (int j = 0; j < ktoRGB_blue.cols; j++) {
                      if (ktoRGB_blue.at<uchar>(i, j) < 0) {
                       ktoRGB_blue.at<uchar>(i,j) = 0;
                       }
                       else if (ktoRGB_blue.at<uchar>(i,j) > 255) {
                       ktoRGB_blue.at<uchar>(i, j) = 255;
                       }
                   }
                }
            }
        }
        
    merge(mv, result);
    imshow("declineT", result);

}

算法的拟合效果,以R通道为例:

 具体的测试效果图:

 当没有检测到人脸时候的效果,可以看到屏幕亮度变暗

 

总结:

本产品已经在windows系统上做了相应的测试

1.支持系统

Windows7及以上,Linux。

2.安装opencv相关文件

在链接里下载用到的所有opencv的静态链接库,并把它们和可执行.exe文件放在同一个文件夹下。

4.使用流程

(1)打开下载路径,在 默认下载 路径下打开 .exe文件就可以直接运行,若提示缺少可执行文件就根据提示把缺少的文件添加到默认目录,缺失的文件可以自己从网上下载或者在分享的链接里下载。

(2) 打开软件后可以点击缩小化按钮让它在后台执行,这样就不会影响正常工作了。

附:本人大二,也是初学者,有些的不对的地方希望大佬们,不吝赐教~~

本文标签: 瞳孔亮度自适应装置屏幕