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

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 工程下:
  欢迎关注头条号:程序员欣宸学习路上,你不孤单,欣宸原创一路相伴...

广东男篮今年还会有实力争总决赛冠军吗?进入总决赛是可以的,只要第三和第四阶段恢复正常水平,再把内线的短板补强一下,应该没有什么问题,目前辽宁和广东还是CBA最强的球队之一,反正我心里一直认为总决赛大概率还是广东vs辽宁许利民离任!中国女篮更换主帅,这群姑娘能否再攀高峰?昨天,中国篮协突然公布了一个决定,安排好了中国女篮接下来的工作。按照中国篮协制定的计划,中国女篮将在1月10日集体前往上海崇明训练基地进行封闭的训练备战,目标是接下来要在塞尔维亚进公司把工作电脑密码改了,微信工作群踢了,想逼我自己辞职,该怎么办?记住,这种时候谁主动谁输,一动不动的是赢家。电脑密码改了,工作群踢了,你留好证据就行了,证明你打不开电脑,进不去工作群,适当的时候通过电话录音,微信私聊等方式固定证据。然后每天按时魔兽世界怀旧服P5中常被忽视的装备有哪些?在魔兽世界怀旧服中配装武器技能是非常关键的,而且很多玩家玩家都非常的依赖BIS推荐的装备,也造成了一些极品装备的价格是非常的高,而一些不被大家所关注的装备反而无人问津,像一些黑龙之WTT澳门冠军赛来了,马龙确定参赛,它和WTT世界杯是一个级别吗?这次澳门冠军赛没有积分,不是一个级别。球友说说玫瑰比心玫瑰wtt澳门赛将于本月19日开打,国乒派出了全主力阵容参赛。马龙许昕刘诗雯选择复出参赛,樊振东王楚钦梁靖崑,陈梦王曼昱孙颖莎魔兽世界怀旧服黑翼之巢掉落的源力之环真的是神器吗,近战收益能否超过迅击戒指?前言现阶段魔兽世界怀旧服玩家都对或多或少的会追求BIS装,并且还会在WCL上面学习高端玩家的打法和配装,这也导致近期源力之环成为了很多玩家口中的神器。源力之环被吹成神器源力之环成为给我们带来幸福了吗?你觉得幸福就幸福,没有统一标准答案。娱乐平台,适应了百人百性百味口。看见了世事百态,看到了从没看过,学到了不懂的,交到了很多朋友,这也算是幸福的一种吗?酸甜苦辣五味杂尘,但还是要感富士康有些职位几乎没有晋升,工作很清闲每月到手7500,你愿意坚持下去吗?真不知道题主在富士康干什么工作,那种轻松,每月到手7500,你开什么玩笑?做梦吧!富士康从来就没有轻松的工作,更没有轻松的工作,能够有7500元的月薪收入!我高度的怀疑你是在为富士魔兽世界怀旧服的战士强不强?天堂向左,战士向右!60年代的战士可以说是一种信仰那么60年代战士好玩吗?的确好玩。但是玩战士需要付出比其他职业多得多的精力和时间,所以在怀旧服中休闲玩家并不适合玩战士,更适合玩法比亚迪Dmi就一个档位怎么让发动机始终工作在高效的转速下呢?1。DMi是P13串并联架构(和本田immD如出一撤),包括纯电模式串联模式并联模式,其中并联模式有一个特殊情况,就是驱动电机不工作,发动机直驱,即直驱模式。2。串联模式下,一般出50岁男性,失业了,如何找月薪5000以上的工作?其实,我相信只要用心,舍得吃苦,不怕丢面子能找到。例举一些身边的真人真事,希望能帮到你。一56岁启动高考模式,转行做危险品押运,。家中亲戚,之前在化工单位上班,55岁退休。随后在家
王者荣耀S29赛季段位继承表段位继承规则一览王者荣耀每次版本的更新都会将玩家的段位进行调整,玩家需要在调整后的段位开启排位赛,目前S29赛季即将要更新,玩家们对新赛季的继承规则还是比较好奇的,那么接下来小编就给大家整理了关于天龙八部荣耀版小程序搬砖详解天龙八部荣耀版,地球小程序搬砖详解。话不多说,直接先上干货。文章最后再说注意事项,请大家认真看完,避免踩坑。就是这一款,超简单,适合佛系搬砖,只在第一天起号时花点时间,过完主线往后Epic送的冷门单机游戏都有哪些值得一玩?头条创作挑战赛聊这个话题之前我要声明一下E宝可没有给我打钱哈,我也和大家一样,每周打开Epic,领取游戏,然后关闭Epic,我自己也有很多游戏是完全没有玩过的。我相信肯定有不少人和梨子西瓜冰淇淋蘸石膏,这样的服法你会用吗?王军肖相如频道导读今天学习张锡纯前辈运用石膏的不同服法生煅石膏的区别。01hr因人而异,变通服法历代医家用生石膏,多伍以他药煎而为汤。然张锡纯依患者及疾病的不同,或为煎剂入药,或为常吃丹参片复方丹参片复方血栓通片血塞通片,有何危害?心血管健康百问百答丹参善于通血脉,散郁结,去瘀生新,调经顺脉,具有活血祛瘀通络止痛宽胸解郁清心除烦之功。本草汇言曰其善治血分,去滞生新,调经顺脉之药。本草纲目称其活血,通心包络。丹膳食均衡中国传统饮食多以植物性食料为主,动物性食料为辅,以五谷杂粮为主食,主食与副食相配合,荤与素相分离,以到达均衡和调补的目的。先秦时期问世的中国第一部医学理论专著黄帝内经将传统饮食构造50岁后,如果能做到这几点,肠胃好,腿脚麻利50岁后,如果能做到这几点,肠胃好,腿脚麻利文爱问360过了50岁后,很多人身体会感到不适小毛病不断精力不充足,甚至记忆力也会伴随下降的情况,这也会令很多人恐惧不已。毕竟在上有老下消散子宫肌瘤的茶饮,建议点赞收藏今天给大家推荐一个茶饮,有助于子宫肌瘤的消散,方法很简单,赶快来试一试吧!原料丝瓜籽9g黄酒红糖各适量E制作过程将丝瓜籽焙干后,用水煎煮1520分钟,调入黄酒红糖即可食用方法患者可秋季养生的小妙招不能忽视,少熬夜,多吃润肺食物秋季养生的小妙招不能忽视,少熬夜,多吃润肺食物文爱问360秋季进入非常干燥的季节,人体也会变得非常虚弱,经过夏天无节制的生活后,很多人的身体也会爆发出各种不适,尤其是在秋冬交替之际秋天是养肺黄金期,吃3物,喝2水,做1事,助你养好肺,身体棒秋天是养肺黄金期,吃3物,喝2水,做1事,助你养好肺,身体更健康一年当中,四季气候不同,因此养生的重点也不同。对于秋天来说,秋季是养肺的黄金期。秋令主燥,燥邪易伤肺,因此秋季注重肺致敏水果排行榜上,这种水果居然位居第一?提到水果过敏,很多人第一个想到的可能是芒果。而国内外的相关研究数据表明在致敏水果排行榜上,桃子稳居第一。桃子是如何引发过敏的?桃子稳居致敏水果排行榜首位桃子营养美味,但有一个很大的