首页 文章 精选 留言 我的

精选列表

搜索[编写],共10000篇文章
优秀的个人博客,低调大师

iOS-《编写高质量代码》笔记 第三章-内存管理

建议17:理解内存和Objective-C内存管理规则 OC 内存管理模式基于对象的“所有权”上。任何对象都会被一个或多个使用者引用,只要对象还有一个使用者,该对象就应该继续存在。如果一个对象没有使用者了,系统将自动销毁它。 建议18:内存管理讲究“好借好还,再借不难” 在返回一个新创建的(拥有的)对象时,应该使用autorelease而不是release来释放所有权。 建议19:区别开alloc 、init、retain、release、和dealloc 之间的差异 OC 中没有new和delete 两个关键字,new可以作为一个函数,也就是alloc + init 。 alloc分配过程不仅进行对象的内存分配,而且还初始化对象的两个非常重要属性,即它的isa实例变量和保持数(引用计数) 。它还将所有的剩下的实例变量设置为0。但是分配完成的对象还是不可用,还需要调用像init这样的初始化方法来进行对象自有的初始化,才能返回一个可用的对象。 建议20:优先使用存取方法来简化内存管理 使用存取方法(getter ,setter)管理内存,可大大降低管理方面出现的问题。 建议21:对象销毁或者移除一定考虑所有权的释放 从集合中移除对象,集合要释放对被移除对象的所有权。(自动释放) 建议22:明智而审慎地使用dealloc dealloc 的角色就是释放对象占用的内存并处理自己所拥有的资源,包括本身变量的释放。 不要尝试用dealloc管理系统资源。应用程序终止时,对象的dealloc可能不会被调用。因为进程的内存是自动清除退出,让操作系统清理资源比调用所有的内存管理方法更有效率。

优秀的个人博客,低调大师

从零开始编写自己的C#框架(5)——三层架构介绍

三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发。 在这里为初学者们简单介绍一下三层架构: (下面内容摘自《趣味理解:三层架构与养猪—《.NET深入体验与实战精要》》,这是以前看到的关于三层架构介绍,觉得挺经典的,大家有时间的话认真看看) 对比以上两图,我们可以看出: 1)数据库好比猪圈 ,所有的猪有序地按区域或编号,存放在不同的猪栏里。 2)DAL 好比是屠宰场 ,把猪从猪圈取出来进行(处理)屠杀,按要求取出相应的部位(字段),或者进行归类整理(统计),形成整箱的猪肉(数据集),传送给食品加工厂( BLL )。本来这里都是同一伙人既管抓猪,又管杀猪的,后来觉得效率太低了,就让一部分人出来专管抓猪了( DBUtility ),根据要求来抓取指定的猪。 3)BLL 好比食品加工厂 ,将猪肉深加工成各种可以食用的食品(业务处理)。 4)Web 好比商场 ,将食品包装成漂亮的可以销售的产品,展现给顾客( UI 表现层)。 5)猪肉好比 Model ,无论是哪个厂(层),各个环节传递的本质都是猪肉,猪肉贯穿整个过程。 6)通用类库 Common 相当于工人使用的各种工具,为各个厂(层)提供诸如杀猪刀、绳子、剪刀、包装箱、工具车等共用的常用工具(类)。其实,每个部门本来是可以自己制作自己的工具的,但是那样会使效率比较低,而且也不专业,并且很多工作都会是重复的。因此,就专门有人开了这样的工厂来制作这些工具,提供给各个工厂,有了这样的分工,工厂就可以专心做自己的事情了。 我们的框架结构 接下来要和大家一起开发的是基于SubSonic3.0 ORM插件的框架,关于SubSonic3.0的具体介绍将会在下一章节详细说明。 在此要向大家声明的是,本框架主要应用于中小型项目,对于并发量非常大、对性能要求非常高的和有完美倾向的开发人员(如开发中必须统一使用一种开发结构,要求三层架构必须使用面向对象的朋友),请拐弯,因为本框架可能不符合你的审美观。 本框架不会完全使用面向对象的方式来进行开发,本框架追求的思想是合适与快捷。即在合适的地方使用适合的插件或技术,整个框架完成后添加新功能、做二次开发或维护时,能方便快捷(速度流)。 比如该用存储过程实现的业务逻辑,就不用强制使用代码来实现,因为有些逻辑使用代码来实现,无论在开发时间、代码量、并发处理、性能上都与存储过程处理没法比;在需要使用ADO.NET来执行SQL语句时,就不会为了统一框架底层调用方法,强制使用SubSonic插件的相关方法来实现,如果你看到这种代码心理很不舒服的话,那只能说我们不在一个频道上,对于我这种实用型开发者来说,所追求的编程模式方向可能与你不同。 下图是本框架的扩展结构发给大家参考一下,以后的章节重点讲解的是红框框住的几个项目,详细讲述本框架底层架构是怎么搭建的,指导初学者们一步步搭建好自己的框架架构。 对比前面的三层架构,大家可能会很奇怪,怎么没有看到Model层的?这是因为我们使用的SubSonic3.0插件所附带的效果,该插件附带的T4模板所生成的Model与DAL混合在一起,很难进行分开。SubSonic插件为了实现更新数据的时候,自动将它所生成的SQL语句剔除掉未赋值字段,只更新已赋值的字段内容,而对实体类的Set进行了改造(如下图)。(注:常见的SQL语句生成框架是没有这种过滤功能) 这样处理将会减少更新数据长度,减少对实体类字段赋值操作(对使用默认值的字段不用再进行赋值操作),减少代码工作量。例如:有些订单表里有几十个字段,其中大部分在创建时使用默认值就可以了,这时只需要对需要的几个字段赋值即可。 框架各项目功能说明 序号 名称 说明 1 Solution.Common 公共函数类 2 SubSonic.Core SubSonic3.0.0.4插件源码 3 Solution.DataAccess 数据访问层 4 Solution.Logic.Managers 业务逻辑层 5 Solution.Web.Managers UI层(后台管理系统) 各层之间调用说明 1) Solution.Commom,主要存放系统要调用到的各种常用工具函数,给其他所有层调用。 2) SubSonic.Core,SubSonic3.0插件源码,主要负责与数据库进行交互,将业务转换成相应的SQL语句,对数据库进行各种增、删、改、查等操作; 3) Solution.DataAccess,主要存放T4模版生成的业务实体(Model)、数据库表结构、业务实体常用函数、存储过程调用函数,以及已封装好的各种数据库操作函数和ADO.NET数据库执行函数; 4) Solution.Logic.Managers,主要存放各种业务逻辑函数,其中SubSonic文件夹里的文件是由T4模版自动生成的常用逻辑函数(会将UI层所要用到的80%以上的函数自动生成出来)。这些逻辑函数主要是接收UI层的操作命令与参数,进行逻辑运算和处理后,提交给Solution.DataAccess层来处理,以实现对数据库表记录的增、删、改、查等操作; 5) Solution.Web.Managers层是UI层,用来展示管理系统的各个页面与功能。主要实现和用户的交互,接收用户请求或展示用户请求的数据结果。 本文转自 AllEmpty 博客园博客,原文链接:http://www.cnblogs.com/EmptyFS/p/3636815.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

一脸懵逼学习hadoop之HDFS的java客户端编写

1:eclipse创建一个项目,然后导入对应的jar包: 鼠标右击项目,点击properties或者alt+enter快捷键--->java build path--->libraries--->add library--->user library--->next--->user libraries--->new--->hdfsLib(根据自己的需要填写)---》add external jars(添加自己的需求包): 2:开始添加自己的需求包,路径如 hadoop-2.4.1\share\hadoop\hdfs的hadoop-hdfs-2.4.1.jar和hadoop-2.4.1\share\hadoop\hdfs\lib下面的全部包; hadoop-2.4.1\share\hadoop\common的hadoop-common-2.4.1.jar和hadoop-2.4.1\share\hadoop\common\lib下面的全部包; 1 package com.master01; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.net.URISyntaxException; 6 7 import org.apache.commons.io.IOUtils; 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.fs.FSDataOutputStream; 10 import org.apache.hadoop.fs.FileStatus; 11 import org.apache.hadoop.fs.FileSystem; 12 import org.apache.hadoop.fs.LocatedFileStatus; 13 import org.apache.hadoop.fs.Path; 14 import org.apache.hadoop.fs.RemoteIterator; 15 16 public class HdfsTest { 17 18 19 //public FileSystem fs = null; 20 /* 21 @Before 22 public void init() throws IOException, InterruptedException, URISyntaxException{ 23 //读配置文件 24 Configuration conf = new Configuration(); 25 //这里直接拷贝配置或者直接设置值 26 conf.set("fs.defaultFS", "hdfs://master:9000/"); 27 28 //获取配置文件里面的内容 29 fs = FileSystem.get(conf); 30 //fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "root"); 31 } 32 */ 33 34 35 /** 36 * 上传文件 37 * @throws IOException 38 */ 39 public static void upload() throws IOException{ 40 //读配置文件 41 //读取classpath下的core-site.xml配置文件,并且解析其的内容,封装到conf的对象中; 42 Configuration conf = new Configuration(); 43 //这里直接拷贝配置或者直接设置值 44 //也可以在代码中对conf的配置信息进行手动设置,会覆盖配置文件中的配置信息 45 conf.set("fs.defaultFS", "hdfs://master:9000"); 46 47 //获取配置文件里面的内容 48 //根据配置信息,去获取一个具体文件系统的客户端操作实例对象 49 FileSystem fs = FileSystem.get(conf); 50 //本地文件是输入流,hdfs是输出流 51 52 //先搞出路径 53 Path src = new Path("hdfs://master:9000/aa/test.txt"); 54 //搞出输出流,即向hdfs上面写内容 55 FSDataOutputStream create = fs.create(src); 56 57 //输入流就是读,本地文件,输入流 58 FileInputStream fileInputStream = new FileInputStream("d:/test.txt"); 59 60 //将文件fileInputStream到create即完成上传到hdfs 61 IOUtils.copy(fileInputStream, create); 62 } 63 64 65 //最快的上传文件的方法 66 public void upload02() throws IllegalArgumentException, IOException, InterruptedException, URISyntaxException{ 67 //读配置文件 68 Configuration conf = new Configuration(); 69 //这里直接拷贝配置或者直接设置值 70 conf.set("fs.defaultFS", "hdfs://master:9000"); 71 72 //获取配置文件里面的内容 73 FileSystem fs = FileSystem.get(conf); 74 //FileSystem fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "root"); 75 fs.copyFromLocalFile(new Path("d:/test.txt"), new Path("hdfs://master:9000/aa/test.txt")); 76 } 77 78 79 /** 80 * 下载文件 81 * @throws IOException 82 * @throws IllegalArgumentException 83 */ 84 public void download02() throws IllegalArgumentException, IOException{ 85 //去配置文件 86 Configuration conf = new Configuration(); 87 conf.set("fs.defaultFS", "hdfs://master:9000"); 88 89 //获取配置文件里面的内容 90 FileSystem fs = FileSystem.get(conf); 91 fs.copyToLocalFile(new Path("hdfs://master:9000/aa/test.txt"), new Path("d:/test2.txt")); 92 93 } 94 95 /*** 96 * 创建文件夹的方法 97 * @throws IOException 98 */ 99 public void mkdir02() throws IOException{ 100 //主配置文件 101 Configuration conf = new Configuration(); 102 //设置配置文件的值 103 conf.set("fs.defaultFS", "hdfs://master:9000"); 104 //获取配置文件里面的内容 105 FileSystem fs = FileSystem.get(conf); 106 107 //文件夹的创建 108 fs.mkdirs(new Path("hdfs://master:9000/aaa/bbb/ccc")); 109 } 110 111 112 /** 113 * 删除文件 114 * @throws IOException 115 */ 116 public void remove02() throws IOException{ 117 //主配置文件 118 Configuration conf = new Configuration(); 119 //设置值 120 conf.set("fs.defaultFS", "hdfs://master:9000"); 121 //获取配置文件里面的内容 122 FileSystem fs = FileSystem.get(conf); 123 124 //执行删除操作 125 fs.delete(new Path("hdfs://master:9000/aaa/bbb/ccc"), true); 126 } 127 128 /** 129 * 文件的移动 130 * @throws IOException 131 */ 132 public void move() throws IOException{ 133 //主配置文件 134 Configuration conf = new Configuration(); 135 //设置值 136 conf.set("fs.defaultFS", "hdfs://master:9000"); 137 //获取配置文件里面的内容 138 FileSystem fs = FileSystem.get(conf); 139 140 //移动操作 141 fs.rename(new Path("hdfs://master:9000/aa/test.txt"), new Path("hdfs://master:9000/aaa/bbb")); 142 } 143 144 /*** 145 * 查看文件的信息 146 * @throws IOException 147 */ 148 public void listFiles() throws IOException{ 149 //主配置文件 150 Configuration conf = new Configuration(); 151 //设置值 152 conf.set("fs.defaultFS", "hdfs://master:9000"); 153 //获取配置文件里面的内容 154 FileSystem fs = FileSystem.get(conf); 155 156 //查看的是文件,不是文件夹 157 //listFiles列出的是文件信息,而且提供递归遍历 158 RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("hdfs://master:9000/"), true); 159 //迭代输出信息 160 while(listFiles.hasNext()){ 161 LocatedFileStatus file = listFiles.next(); 162 //文件路径 163 Path path = file.getPath(); 164 System.out.println(path.getName()); 165 } 166 167 System.out.println("============================================="); 168 //listStatus列出文件和文件夹的信息,但是不提供自带的递归遍历 169 FileStatus[] listStatus = fs.listStatus(new Path("hdfs://master:9000/")); 170 /*for(int i = 0 ; i<listStatus.length; i++){ 171 System.out.println(listStatus[i]); 172 }*/ 173 for(FileStatus fileStatus : listStatus){ 174 //根据获取的路径获取文件夹的名称 175 Path path = fileStatus.getPath(); 176 System.out.println(path.getName()); 177 } 178 179 } 180 181 public static void main(String[] args) { 182 HdfsTest hdfsTest = new HdfsTest(); 183 try { 184 //上传文件的调用 185 //hdfsTest.upload02(); 186 187 //下载文件的调用 188 //hdfsTest.download02(); 189 190 //文件夹的创建 191 //hdfsTest.mkdir02(); 192 193 //删除操作 194 //hdfsTest.remove02(); 195 196 //移动文件的操作 197 //hdfsTest.move(); 198 199 //查看文件信息 200 hdfsTest.listFiles(); 201 } catch (Exception e) { 202 e.printStackTrace(); 203 } 204 } 205 206 } 3:NameNode的职责 (1):维护元数据的信息; (2):维护hdfs的目录树; (3):响应客户端的请求;

优秀的个人博客,低调大师

Flume安装部署,采集方案配置文件编写案例,启动agent采集数据

1.2 Flume实战案例 1.2.1 Flume的安装部署 1、Flume的安装非常简单,只需要解压即可,当然,前提是已有hadoop环境 上传安装包到数据源所在节点上 然后解压 tar -zxvf apache-flume-1.6.0-bin.tar.gz,最终解压到的位置是:/home/tuzq/software/apache-flume-1.6.0-bin 然后进入flume的目录,修改conf下的flume-env.sh,在里面配置JAVA_HOME 2、根据数据采集的需求配置采集方案,描述在配置文件中(文件名可任意自定义) 3、指定采集方案配置文件,在相应的节点上启动flume agent 先用一个最简单的例子来测试一下程序环境是否正常 1、先在flume的conf目录下新建一个文件 vi netcat-logger.conf(这个是我们自己定义的采集方案的配置文件) #定义这个agent中各组件的名字 ##表示agent中的source组件 a1.sources = r1 ##表示的是下沉组件sink a1.sinks = k1 ##agent内部的数据传输通道channel,用于从source将数据传递到sink a1.channels = c1 #描述和配置source组件:r1 ##netcat用于监听一个端口的 a1.sources.r1.type = netcat ##配置的绑定地址,这个机器的hostname是hadoop1,所以下面也可以配置成hadoop1 a1.sources.r1.bind = localhost ##配置的绑定端口 a1.sources.r1.port = 44444 #描述和配置sink组件:k1 a1.sinks.k1.type = logger ##描述和配置channel组件,此处使用时内存缓存的方式 #下面表示的是缓存到内存中,如果是文件,可以使用file的那种类型 a1.channels.c1.type = memory #表示用多大的空间 a1.channels.c1.capacity = 1000 #下面表示用事务的空间是多大 a1.channels.c1.transactionCapacity = 100 # 描述和配置source channel sink之间的连接关系,因为source和sink依赖channel来传递数据,所以要分别指定用的是哪个channel。 a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 2、启动agent去采集数据 bin/flume-ng agent -c conf -f conf/netcat-logger.conf -n a1 -Dflume.root.logger=INFO,console -c conf 指定flume自身的配置文件所在目录 -f conf/netcat-logger.con 指定我们所描述的采集方案 -n a1 指定我们这个agent的名字(是配置文件中写的那个agent) 3、测试 先要往agent采集监听的端口上发送数据,让agent有数据可采 随便在一个能跟agent节点联网的机器上 telnet anget-hostname port (telnet hadoop1 44444) 在telnet终端上输入内容,最后回到打开的agent,发现有内容输出,输出的内容如下: 综上所述:说明flume已经安装配置成功!

优秀的个人博客,低调大师

在tiny4412源码下编写全系统编译执行脚本

今天心血来潮,想把之前做的开发板环境配置以及编译的东西重新整理一下,毕竟最近在搞开发,所以有必要温故而知新。 以下是我整个Android-5.0的工程目录列表: 其中build_4412_img.sh、copyimage_to_window_system.sh是我自己写的快速编译拷贝脚本。 book@book-virtual-machine:/work/android-5.0.2$ ls abi build_4412_img.sh development gen-img.sh Makefile prebuilts tools art copyimage_to_window_sysetm.sh device hardware ndk rodev vendor bionic cts docs kernel out sdk bootable dalvik external libcore packages setenv build developers frameworks libnativehelper pdk system 首先来看看build_4412_img.sh这个脚本,脚本对应的代码如下: #build system IMG #build system img and copy img to window share #Y.X.YANG #date:2016.12.22 cd /work/android-5.0.2/kernel/ #首先切换到工程的kernel主目录 make -j4 #开始编译内核 echo $? if test $? -eq 0 #判断编译是否出错,出错直接退出,编译成功将生成的zImage拷贝至window共享目录 then echo "build 4412 kernel-img success!" cp /work/android-5.0.2/kernel/arch/arm/boot/zImage /mnt/hgfs/share/images/ else echo "build 4412 kernel-img fair!" exit 0 fi cd /work/android-5.0.2/ #kernel编译完成后接下来编译Android源码 . setenv #先设置编译环境,下面有setenv的源码 lunch full_tiny4412-eng #选择我们要编译的产品,我们这里选择4412的工程版本 make -j4 #编译 ./gen-img.sh #生成对应产品的img ./copyimage_to_window_sysetm.sh #将img拷贝到window共享目录 接下来这个就是setenv的源码: #!/bin/bash CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}') # java OPENJDK7_DIR=/usr/lib/jvm/java-7-openjdk-amd64 java_version_str=`java -version 2>&1 | grep '^java .*[ "]1\.7[\. "$$]'` if [ "x$java_version_str" = "x" ]; then export PATH=${OPENJDK7_DIR}/bin:$PATH fi PRODUCT='full_tiny4412' #这里是对应的产品 source build/envsetup.sh #和大多数安卓编译的方式一样的,这里只是把souce build/envsetup.sh放到setenv这个脚本里面来了 TARGET_PRODUCT=$PRODUCT TARGET_SIMULATOR=false TARGET_BUILD_TYPE=release TARGET_BUILD_VARIANT=eng export PATH TARGET_PRODUCT TARGET_SIMULATOR TARGET_BUILD_TYPE TARGET_BUILD_VARIANT #这里是对应的外部环境变量引用 # settitle COMBO4FA=${TARGET_PRODUCT}-${TARGET_BUILD_VARIANT} #设置标题 export PROMPT_COMMAND="echo -ne \"\033]0;[${COMBO4FA}] ${USER}@${HOSTNAME}: ${PWD}\007\"" 接下来这个是gen-img.sh,作用是将生成在out目录下的img拷贝到源码的根目录下: #!/bin/bash OUTDIR=out/target/product/tiny4412 #这里就是out生成img的路径 AHOSTBIN=out/host/linux-x86/bin #选择对应的工具 # install vendor files #安装供应商文件 if [ -d vendor/friendly-arm/tiny4412/rootdir/system/ ]; then cp -af vendor/friendly-arm/tiny4412/rootdir/system/* ${OUTDIR}/system/ fi if [ -d vendor/friendly-arm/tiny4412/rootdir/data/ ]; then cp -af vendor/friendly-arm/tiny4412/rootdir/data/* ${OUTDIR}/data/ fi # make images #生成img LOPTS="-T -1 -S ${OUTDIR}/root/file_contexts" ${AHOSTBIN}/make_ext4fs -s ${LOPTS} -l 629145600 -a system system.img ${OUTDIR}/system # eMMC Size | UserData partition Size #------------------------------------------------ # 4G | 2149580800 (2G) 2050*1024*1024 # 8G | 4299161600 (4G) # 16G | 10747904000 (10G) 10250*1024*1024 #------------------------------------------------ ${AHOSTBIN}/make_ext4fs -s ${LOPTS} -l 2149580800 -a data userdata-4g.img ${OUTDIR}/data ${AHOSTBIN}/make_ext4fs -s ${LOPTS} -l 4299161600 -a data userdata-8g.img ${OUTDIR}/data ${AHOSTBIN}/make_ext4fs -s ${LOPTS} -l 10485760000 -a data userdata-16g.img ${OUTDIR}/data cp userdata-4g.img userdata.img #拷贝对应的img # ramdisk ${AHOSTBIN}/mkbootfs ${OUTDIR}/root | ${AHOSTBIN}/minigzip > ${OUTDIR}/ramdisk.img mkimage -A arm -O linux -T ramdisk -C none -a 0x40800000 -n "ramdisk" \ -d ${OUTDIR}/ramdisk.img ramdisk-u.img # minitools support #minitool 工具支持 MINITOOLS_PATH=/opt/MiniTools/tiny4412/images/Android5.0 if [ -d ${MINITOOLS_PATH} ]; then cp -f ramdisk-u.img ${MINITOOLS_PATH}/ cp -f system.img ${MINITOOLS_PATH}/ cp -f userdata*.img ${MINITOOLS_PATH}/ ls -l ${MINITOOLS_PATH}/ramdisk-u.img ls -l ${MINITOOLS_PATH}/system.img ls -l ${MINITOOLS_PATH}/userdata*.img fi 接下来这个是copyimage_to_window_system.sh,作用是将生成的img拷贝到window共享目录 sudo mv userdata-16g.img userdata-4g.img userdata-8g.img userdata.img system.img ramdisk-u.img /mnt/hgfs/share/images/ 往后的文章会介绍如何修改4412上的配置文件,会做成sdk修改记录,欢迎大家有空来学习。

优秀的个人博客,低调大师

Qt编写的项目作品24-人脸识别综合应用(在线+离线+嵌入式)

一、功能特点 支持的功能包括人脸识别、人脸比对、人脸搜索、活体检测等。 在线版还支持身份证、驾驶证、行驶证、银行卡等识别。 在线版的协议支持百度、旷视,离线版的支持百度,可定制。 除了支持X86架构,还支持嵌入式linux比如contex-A9、树莓派等。 每个功能的执行除了返回结果还返回执行用时时间。 多线程处理,通过type控制当前处理类型。 支持单张图片检索相似度最高的图片。 支持指定目录图片用来生成人脸特征值文件。 可设置等待处理图片队列中的数量。 每次执行都有成功或者失败的信号返回。 人脸搜索的返回结果包含了原图+最大相似度图+相似度等。 人脸比对同时支持两张图片和两个特征值比对。 相关功能自定义一套协议用于客户端和服务端,可以通过TCP通信进行交互。 自定义人脸识别协议非常适用于中心一台服务器,现场若干设备请求的场景。 每个模块全部是独立的一个类,代码整洁、注释完善。 自定义人脸识别协议功能: 离线使用,同时支持百度的离线包和嵌入式linux人脸识别静态库。 支持多个连接并发,自动排队处理,返回的时候带上唯一标识区分。 传入单张图片返回人脸区域。 传入单张图片返回人脸特征值。 传入单张图片或者多张图片返回是否是活体。 传入两张图片返回比对结果。 传入两个特征值返回比对结果。 传入单张图片添加人脸。 指定唯一标识符删除人脸。 传入单张照片返回相似度最大的人脸信息。 修改人脸服务的配置参数比如是否快速查找、人脸占比等。 二、效果图 三、体验地址 体验地址:https://pan.baidu.com/s/1bbL2ZughZAgfIGrexyN-9g 提取码:zkeh 名称:bin_video_face.zip 国内站点:https://gitee.com/feiyangqingyun 国际站点:https://github.com/feiyangqingyun 个人主页:https://blog.csdn.net/feiyangqingyun 知乎主页:https://www.zhihu.com/people/feiyangqingyun/ 备注:如果网盘下载不到可以去开源主页下载

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。