范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JavaCV人脸识别三部曲之二训练

  欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《JavaCV人脸识别三部曲》的第二篇,前文《视频中的人脸保存为图片》咱们借助摄像头为两位群众演员生成大量人脸照片,如下图,群众演员A的照片保存在 E:	emp2021121801 man ,B的照片保存在 E:	emp2021121801 woman :
  照片准备好,并且每张照片的身份都已确定,本篇要做的就是用上述照片生成模型文件,今后新的人脸就可以用这个模型来检查了 关于训练,可以用下图来表示,一共六张照片两个类别,训练完成后得到模型文件 faceRecognizer.xml :
  编码训练的代码很简单,在一个java文件中搞定吧, simple-grab-push 是整个《JavaCV的摄像头实战》系列一直再用的工程,现在该工程中新增文件TrainFromDirectory.java ,完整代码如下,有几处要注意的地方稍后提到:package com.bolingcavalry.grabpush.extend;  import com.bolingcavalry.grabpush.Constants; import org.bytedeco.opencv.global.opencv_imgcodecs; import org.bytedeco.opencv.opencv_core.Mat; import org.bytedeco.opencv.opencv_core.MatVector; import org.bytedeco.opencv.opencv_core.Size; import org.bytedeco.opencv.opencv_face.FaceRecognizer; import org.bytedeco.opencv.opencv_face.FisherFaceRecognizer;  import java.io.File; import java.io.IOException; import java.nio.IntBuffer; import java.util.LinkedList; import java.util.List;  import static org.bytedeco.opencv.global.opencv_core.CV_32SC1; import static org.bytedeco.opencv.global.opencv_imgcodecs.IMREAD_GRAYSCALE; import static org.bytedeco.opencv.global.opencv_imgproc.resize;  /**  * @author willzhao  * @version 1.0  * @description 训练  * @date 2021/12/12 18:26  */ public class TrainFromDirectory {      /**      * 从指定目录下      * @param dirs      * @param outputPath      * @throws IOException      */     private void train(String[] dirs, String outputPath) throws IOException {         int totalImageNums = 0;          // 统计每个路径下的照片数,加在一起就是照片总数         for(String dir : dirs) {             List files = getAllFilePath(dir);             totalImageNums += files.size();         }          System.out.println("total : " + totalImageNums);          // 这里用来保存每一张照片的序号,和照片的Mat对象         MatVector imageIndexMatMap = new MatVector(totalImageNums);          Mat lables = new Mat(totalImageNums, 1, CV_32SC1);          // 这里用来保存每一张照片的序号,和照片的类别         IntBuffer lablesBuf = lables.createBuffer();          // 类别序号,从1开始,dirs中的每个目录就是一个类别         int kindIndex = 1;          // 照片序号,从0开始         int imageIndex = 0;          // 每个目录下的照片都遍历         for(String dir : dirs) {             // 得到当前目录下所有照片的绝对路径             List files = getAllFilePath(dir);              // 处理一个目录下的每张照片,它们的序号不同,类别相同             for(String file : files) {                 // imageIndexMatMap放的是照片的序号和Mat对象                 imageIndexMatMap.put(imageIndex, read(file));                 // bablesBuf放的是照片序号和类别                 lablesBuf.put(imageIndex, kindIndex);                 // 照片序号加一                 imageIndex++;             }              // 每当遍历完一个目录,才会将类别加一             kindIndex++;         }          // 实例化人脸识别类         FaceRecognizer faceRecognizer = FisherFaceRecognizer.create();         // 训练,入参就是图片集合和分类集合         faceRecognizer.train(imageIndexMatMap, lables);         // 训练完成后,模型保存在指定位置         faceRecognizer.save(outputPath);         //释放资源         faceRecognizer.close();     }      /**      * 读取指定图片的灰度图,调整为指定大小      * @param path      * @return      */     private static Mat read(String path) {         Mat faceMat = opencv_imgcodecs.imread(path,IMREAD_GRAYSCALE);         resize(faceMat, faceMat, new Size(Constants.RESIZE_WIDTH, Constants.RESIZE_HEIGHT));         return faceMat;     }      /**      * 把指定路径下所有文件的绝对路径放入list集合中返回      * @param path      * @return      */     public static List getAllFilePath(String path) {         List paths = new LinkedList<>();          File file = new File(path);          if (file.exists()) {             // 列出该目录下的所有文件             File[] files = file.listFiles();              for (File f : files) {                 if (!f.isDirectory()) {                     // 把每个文件的绝对路径都放在list中                     paths.add(f.getAbsolutePath());                 }             }         }          return paths;     }      public static void main(String[] args) throws IOException {          String base = "E:temp2021121801";          // 存储图片的两个目录         // man目录下保存了群众演员A的所有人脸照片,         // woman目录下保存了群众演员B的所有人脸照片         String[] dirs = {base + "man", base + "woman"};          // 开始训练,并指定模型输出位置         new TrainFromDirectory().train(dirs, base + "faceRecognizer.xml");     } }上述代码有以下几处要注意: 静态方法read用于将图片转为Mat 静态方法getAllFilePath可以遍历指定目录下的所有文件,把它们的绝对路径返回 train一共获取了man和woman两个目录下的照片,man目录下的照片的类别是1,women目录下的照片类别是2 识别类是FisherFaceRecognizer,现在的训练和下一篇的识别都用这个类 执行运行main方法,待执行完成后,如下图,可见目录 E:	emp2021121801 下已经生成模型文件faceRecognizer.xml :
  至此,本篇任务已完成,下一篇进入终极实战,用本篇训练的模型识别摄像头中的人脸,并把识别结果展示在预览页面上; 源码下载《JavaCV的摄像头实战》的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
  这个git项目中有多个文件夹,本篇的源码在 javacv-tutorials 文件夹下,如下图红框所示:
  javacv-tutorials 里面有多个子工程,《JavaCV的摄像头实战》系列的代码在 simple-grab-push 工程下:
  欢迎关注头条号:程序员欣宸学习路上,你不孤单,欣宸原创一路相伴...

人到苏州必有为丨没有GPS也能避障和寻找目标,苏州为智能无人机研发插上翅膀视频加载中近30年来,中国无人机产业从无到有,从追赶到异军突起。在太仓有一位在这个领域深耕了20多年的工程师,他曾和团队用无人机完成多个重要探测任务。如今,在5G人工智能物联网等新苏州最富女强人范红卫27岁借300多万创业,如今身家1700亿敢赌的企业家不少,但范红卫的赌徒特质尤为强烈。范红卫从一个安守本分的供销社会计,到身价1700亿的中国女首富恒力集团从默默无闻到年收入赶超华为,成为2022年中国民营企业榜单第三名比亚迪预计前三季净利润大涨2。7倍10月17日,比亚迪发布业绩预告称,预计2022年前三季度实现净利润91亿元至95亿元,同比大涨2。7倍以上。表现更出色的是扣非净利润,前三季度预计达到81亿元至88亿元,同比大增阿科力前三季最高预盈1。1亿连续三年满产满销拟10。5亿扩产长江商报记者张佩长江商报消息连续三年实现满产满销,阿科力(603722。SH)拟大举扩产增加产能。10月17日晚间,阿科力抛出新一轮投建计划。公司近日与潜江江汉管委会签署投资协议,A股近期要爆发一波吗?今日上午,A股主要指数又是全线飘红,热门的储能赛道,掀起涨停潮。次新金融期货股弘业期货,又涨停了。易方达汇添富华夏基金等多家头部公募基金公司券商资管宣布拟于近期自购旗下基金产品,涉5个有趣的Python脚本Python可以玩的方向有很多,比如爬虫预测分析GUI自动化图像处理可视化等等,可能只需要十几行代码就能实现酷炫的功能。因为Python是动态脚本语言,所以代码逻辑比Java要简要大美中国奇丽云南!你见过怎样的中国?辽阔陆地面积约960万平方公里水域面积约470万平方公里壮丽长江,全长6300余千米珠穆朗玛峰,高8848。86米大美中国,不止于此在彩云之南藏有不少奇景它们在时云南生活品质会更高电影阿诗玛让云南石林家喻户晓。金秋十月,阿诗玛的故乡云南石林县处处稻谷摇曳,一派丰收景象。10月16日一早,村村寨寨的干部群众就聚在一起,集体收看党的二十大开幕会。记者来到了传说中云南忆,最忆是昆明一一致已逝去青春的自己怀旧是一种眷恋,如果时光不能重来,那我们至少还可以在老照片里温故那旧时的一缕吉光片羽。1982年昆明现状图因为1982年我在昆明驻过数月,所以印象最深。作为广西人,从踏进昆明市起,燕国是由谁建立的,西周时期的燕国实力强大吗?头条创作挑战赛战国七雄当中,位于最北方的就是燕国,他也是唯一一个姬姓诸侯国。所以,燕国的历史,最早其实可以追溯到西周建立之时。武王伐纣之后,分封了许多的诸侯国。这些国家大部分都位于2005年,河南出土千年古墓,流沙暗石防盗,80多个盗墓贼命丧于此如果您喜欢这篇文章,请点击右上方的关注。感谢您的支持和鼓励,希望能给您带来舒适的阅读体验。轰的一声爆破声,惊动了正处在新年喜悦中的河南省上蔡县郭庄村村民们。2005年春节前夕,家家
英雄联盟曾经最吃香的装备最后的轻语为什么现在很少有人出了?大家好,我是马站长啊!最后的轻语这件装备在以前可谓是ADC后期必出的一件装备。价格不算太高,但是效果显著。但是,纵观最近的各大比赛甚至是路人游戏中,我们都看不到这件装备了,甚至已经激光电视有什么缺点,为什么用户体验那么差?激光电视的缺点,我可清楚的很,我家就装了一台某品牌的激光电视,最后的结果就是,白天看不清,晚上不敢看,装上就动不了,开机还很吵。先说白天看不清楚,我家的激光电视,画面里的人物肤色偏有没有什么能肝,装备有多种选择,且类似于星际战甲的游戏?这里是喜爱游戏的小白星际战甲是DigitalExtremes研发的一款科幻题材的第三人称射击网游,正如游戏的名字一样,游戏中有各式各样的战甲供玩家选择,这些战甲不仅外观华丽,能力值为什么内行人换手机不愿意选128GB版本?什么乱七八糟的问题?还内行外行?你现在64g勉强够用下次就换128,128勉强够用下次就换256,以此类推。个人习惯决定你的需求。选择手机内存空间还是要看个人需求。随着科技的进步,我这两天DNF两个号全被盗了,我所有装备都是锁住的可是还是被分解了怎么回事?谢谢这位粉丝的邀请,秀儿为你竭诚解答!首选对你的遭遇表示同情,DNF两个号都被盗了,还把装备也给分解了,万恶的盗号狗,让我想起了当年我的遭遇,不堪回首,差点脱坑!(当年刷灵魂兑换无近日,梦幻西游主播恶意找回价值50万装备致使卖家被封号,你怎么看?从昨天开始我就看到了这个事件,主播是帮别人鉴定装备,出了价值50万的装备,然后恶意找回,致使卖家号被封,还没拿到钱,买家买的物品被卡在了藏宝阁。这真是赔了夫人又折兵,心疼卖家一分钟高血压吃中药降压好还是西药降压好?很多人都关心高血压吃中药好?还是西药好?在绝大多数人眼里,中药没有副作用,中药能除根而西药副作用大,治标不治本。我们今天不讨论中药西药这么大的话题,我们也无权讨论,我们就聊聊当一个你有没有发现人的口味会随着年龄段不同而改变?你的口味变了吗?是啊!小时候喜欢吃甜的东西,糖是最爱。喜欢到什么程度?一口蛀牙,爸妈看到都害怕,不让吃的程度了,但是还是会偷偷吃。后来慢慢长大了我喜欢吃辣的东西了,最喜欢就是吃麻辣火锅,以至于拍拖体检时做了头腹部CT,体检后一个星期发现怀孕了,宝宝还能要吗?怀孕后照CT有可能严重影响胎儿的智力发育,建议咨询医生,也不要为此事太过焦虑,怀孕期间要保持良好的心态和情绪。一定要按时做产检,这种情况,千万别忘了做排畸类的检查,检查时也要告诉医发现手机一直被某个应用在后台获取我的信息,怎么办?首先,很高兴来回答你这个问题。现实中,作为一个手机用户,因工作和生活的需要,免不了要下载一些app来使用。但是,如果我们要深度使用任何一款app,都是要被获取个人相关信息的。否则一怎样从零开始培养看书习惯?就在两三年前,我一看书就头疼瞌睡浑身刺挠。即使强迫自己坐桌子那看书,也感觉身后有鬼一样,时不时就得回头望望,要么就得看看手机,或者起身溜达溜达。那些年,一年看完一本书对我来说都是奢