1,采坑备忘
(1)8.1版本的SDK在spring-boot接口访问第一次正常,第二次之后JVM会奔溃,可能是java gc 处理C++开出的内存有问题。
换6.1.3版本的SDK。
(2)6.1.3版本SDK无法加载BaiduFaceApi.dll。依赖vc_redist.x64 2013,包里给的是2015。
2,spring-boot项目示例
(1)pom.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0
</modelVersion>
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>2.3.3.RELEASE
</version>
-
<relativePath/>
<!-- lookup parent from repository -->
-
</parent>
-
<groupId>com.ai
</groupId>
-
<artifactId>risun-ai
</artifactId>
-
<version>0.0.1-SNAPSHOT
</version>
-
<name>risun-ai
</name>
-
<description>Demo project for Spring Boot
</description>
-
<properties>
-
<java.version>1.8
</java.version>
-
</properties>
-
-
<repositories>
-
<repository>
-
<id>huaweicloud
</id>
-
<url>https://repo.huaweicloud.com/repository/maven/
</url>
-
<!--<url>http://maven.aliyun.com/nexus/content/groups/public/</url>-->
-
<releases>
-
<enabled>true
</enabled>
-
</releases>
-
<snapshots>
-
<enabled>true
</enabled>
-
<updatePolicy>always
</updatePolicy>
-
<checksumPolicy>fail
</checksumPolicy>
-
</snapshots>
-
</repository>
-
</repositories>
-
-
<dependencies>
-
<dependency>
-
<groupId>javax.servlet
</groupId>
-
<artifactId>javax.servlet-api
</artifactId>
-
<scope>provided
</scope>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter
</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-web
</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-test
</artifactId>
-
<scope>test
</scope>
-
</dependency>
-
-
<dependency>
-
<groupId>io.springfox
</groupId>
-
<artifactId>springfox-swagger2
</artifactId>
-
<version>2.9.2
</version>
-
</dependency>
-
<dependency>
-
<groupId>io.springfox
</groupId>
-
<artifactId>springfox-swagger-ui
</artifactId>
-
<version>2.9.2
</version>
-
</dependency>
-
-
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
-
<dependency>
-
<groupId>org.projectlombok
</groupId>
-
<artifactId>lombok
</artifactId>
-
<version>1.18.22
</version>
-
<scope>provided
</scope>
-
</dependency>
-
-
<dependency>
-
<groupId>com.baidu.aip
</groupId>
-
<artifactId>java-sdk
</artifactId>
-
<version>4.15.1
</version>
-
</dependency>
-
<dependency>
-
<groupId>com.google.code.gson
</groupId>
-
<artifactId>gson
</artifactId>
-
<version>2.8.3
</version>
-
</dependency>
-
<dependency>
-
<groupId>com.google.code.gson
</groupId>
-
<artifactId>gson
</artifactId>
-
<version>2.8.5
</version>
-
</dependency>
-
-
<dependency>
-
<groupId>org.apache.httpcomponents
</groupId>
-
<artifactId>httpclient
</artifactId>
-
<version>4.5.2
</version>
-
</dependency>
-
-
</dependencies>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
-
</project>
(2)启动
-
package com;
-
-
import org.springframework.boot.SpringApplication;
-
import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
import com.ai.local.FaceLocalFactory;
-
import com.jni.face.Face;
-
-
@SpringBootApplication
-
public
class
RisunAiApplication {
-
public
static
void
main
(String[] args) {
-
//FaceLocalFactory.sdkInit();
-
//Face.loadDbFace();
-
SpringApplication.run(RisunAiApplication.class, args);
-
System.out.println(
":::主线程启动");
-
}
-
-
}
-
package com;
-
/**
-
*@author created by Jerry
-
*@date 2022年12月23日---下午4:51:37
-
*@problem
-
*@answer
-
*@action
-
*/
-
-
import com.jni.face.Face;
-
import org.springframework.boot.ApplicationArguments;
-
import org.springframework.boot.ApplicationRunner;
-
import org.springframework.stereotype.Component;
-
-
@Component
-
public
class
SdkInit
implements
ApplicationRunner{
-
@Override
-
public
void
run
(ApplicationArguments applicationArguments)
throws Exception{
-
/* sdk初始化 */
-
Face
api
=
new
Face();
-
// model_path为模型文件夹路径,即models文件夹(里面存的是人脸识别的模型文件)
-
// 传空为采用默认路径,若想定置化路径,请填写全局路径如:d:\\face (models模型文件夹目录放置后为d:\\face\\models)
-
// 若模型文件夹采用定置化路径,则激活文件(license.ini, license.key)也可采用定制化路径放置到该目录如d:\\face\\license
-
// 亦可在激活文件默认生成的路径
-
String
modelPath
=
"";
-
int
res
= api.sdkInit(modelPath);
-
if (res !=
0) {
-
System.out.printf(
"sdk init fail and error =%d\n", res);
-
}
-
-
Face.loadDbFace();
-
-
// 获取设备指纹
-
String
deviceId
= Face.getDeviceId();
-
System.out.printf(
"device id:" + deviceId);
-
// 获取版本号
-
String
ver
= Face.sdkVersion();
-
System.out.printf(
"sdk version:" + ver);
-
}
-
}
-
package com;
-
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.boot.CommandLineRunner;
-
import org.springframework.stereotype.Component;
-
import com.task.ClearFilesTask;
-
-
/**
-
*
-
* @author jerry
-
* 清理垃圾
-
*/
-
@Component
-
public
class
Branch_02
implements
CommandLineRunner {
-
Logger
m_log
= LoggerFactory.getLogger(getClass());
-
@Value("${cacheTime}")
-
Long m_cacheTime;
-
-
@Autowired
-
ClearFilesTask m_clearFilesTask;
-
-
@Override
-
public
void
run
(String... arg0)
throws Exception {
-
if (m_cacheTime <=
0) {
-
return;
-
}
-
this.m_log.info(
":::清理线程启动");
-
Thread
thread
=
new
Thread(
this.m_clearFilesTask);
-
thread.start();
-
}
-
-
}
-
package com;
-
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.boot.CommandLineRunner;
-
import org.springframework.stereotype.Component;
-
-
import com.ai.local.FaceLocalFactory;
-
import com.jni.face.Face;
-
import com.task.CamersLocalTask;
-
-
/**
-
*
-
* @author jerry
-
* 截图识别 本地离线
-
*/
-
@Component
-
public
class
Branch_04
implements
CommandLineRunner {
-
Logger
m_log
= LoggerFactory.getLogger(getClass());
-
-
@Value("${rtspLocalScreenshot}")
-
String rtspLocalScreenshot;
-
-
@Autowired
-
CamersLocalTask m_camersLocalTask;
-
-
@Override
-
public
void
run
(String... arg0)
throws Exception {
-
if (
this.rtspLocalScreenshot !=
null &&
this.rtspLocalScreenshot.equalsIgnoreCase(
"false")) {
-
return;
-
}
-
this.m_log.info(
":::本地离线截图识别线程启动");
-
Thread
thread
=
new
Thread(
this.m_camersLocalTask);
-
thread.start();
-
}
-
-
}
(3)人脸库管理
-
package com.controller;
-
-
import java.io.File;
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
import java.util.HashMap;
-
import java.util.Map;
-
import java.util.UUID;
-
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.stereotype.Controller;
-
import org.springframework.web.bind.annotation.GetMapping;
-
import org.springframework.web.bind.annotation.PathVariable;
-
import org.springframework.web.bind.annotation.PostMapping;
-
import org.springframework.web.bind.annotation.RequestBody;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestMethod;
-
import org.springframework.web.bind.annotation.RequestParam;
-
import org.springframework.web.bind.annotation.ResponseBody;
-
import org.springframework.web.multipart.MultipartFile;
-
-
import com.ai.local.FaceLibLocal;
-
import com.ai.local.entity.UserFace;
-
import com.util.AjaxResult;
-
import com.util.FileUtil;
-
-
import io.swagger.annotations.Api;
-
import io.swagger.annotations.ApiImplicitParam;
-
import io.swagger.annotations.ApiImplicitParams;
-
import io.swagger.annotations.ApiModelProperty;
-
import io.swagger.annotations.ApiOperation;
-
-
@Api(value = "FaceLibController", description = "本地人脸库管理接口")
-
@Controller
-
@RequestMapping(value = "/facelib")
-
@ResponseBody
-
public
class
FaceLibController
extends
BasicController
-
{
-
@Autowired
-
FaceLibLocal m_FaceLibLocal;
-
-
@Value("${upload_path}")
-
String upload_path;
-
-
@ApiOperation(value="获取组列表",notes="获取组列表")
-
@GetMapping(value = "/getGroupList")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "pageStart", value = "起始页码", example="0", required = true ,dataType = "int",paramType = "query"),
-
@ApiImplicitParam(name = "pageSize", value = "每页条数", example="10", required = true ,dataType = "int",paramType = "query")
-
})
-
public AjaxResult
getGroupList
(@RequestParam(defaultValue = "pageStart") int pageStart, @RequestParam(defaultValue = "pageSize") int pageSize)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.getGroupList(pageStart, pageSize));
-
}
-
-
@ApiOperation(value="添加组",notes="添加组")
-
@GetMapping(value = "/addGroup")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "groupid", value = "组ID", required = true ,dataType = "string",paramType = "query")
-
})
-
public AjaxResult
addGroup
(@RequestParam(defaultValue = "groupid") String groupid)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.addGroup(groupid));
-
}
-
-
@ApiOperation(value="删除组",notes="删除组")
-
@GetMapping(value = "/removeGroup")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "groupid", value = "组ID", required = true ,dataType = "string",paramType = "query")
-
})
-
public AjaxResult
removeGroup
(@RequestParam(defaultValue = "groupid") String groupid)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.removeGroup(groupid));
-
}
-
-
@ApiOperation(value="获取某组的用户列表",notes="获取某组的用户列表")
-
@GetMapping(value = "/getUserList")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "groupid", value = "组ID", required = true ,dataType = "string",paramType = "query"),
-
@ApiImplicitParam(name = "pageStart", value = "起始页码", example="0", required = true ,dataType = "int",paramType = "query"),
-
@ApiImplicitParam(name = "pageSize", value = "每页条数", example="10", required = true ,dataType = "int",paramType = "query")
-
})
-
public AjaxResult
getUserList
(
-
@RequestParam(defaultValue = "groupid") String groupid,
-
@RequestParam(defaultValue = "pageStart")
int pageStart,
-
@RequestParam(defaultValue = "pageSize")
int pageSize)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.getUserList(groupid, pageStart, pageSize));
-
}
-
-
@ApiOperation(value="删除用户",notes="删除用户")
-
@GetMapping(value = "/removeUser")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "userid", value = "用户ID", required = true ,dataType = "string",paramType = "query"),
-
@ApiImplicitParam(name = "groupid", value = "组ID", required = true ,dataType = "string",paramType = "query")
-
})
-
public AjaxResult
removeUser
(
-
@RequestParam(defaultValue = "userid") String userid,
-
@RequestParam(defaultValue = "groupid") String groupid )
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.removeUser(userid, groupid));
-
}
-
-
@ApiOperation(value="获取用户详情",notes="获取用户详情")
-
@GetMapping(value = "/getUser")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "userid", value = "用户ID", required = true ,dataType = "string",paramType = "query"),
-
@ApiImplicitParam(name = "groupid", value = "组ID", required = true ,dataType = "string",paramType = "query")
-
})
-
public AjaxResult
getUser
(
-
@RequestParam(defaultValue = "userid") String userid,
-
@RequestParam(defaultValue = "groupid") String groupid)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.getUser(userid, groupid));
-
}
-
-
@ApiOperation(value="获取人脸数量",notes="获取人脸数量")
-
@GetMapping(value = "/getDbFaceCount")
-
@ApiImplicitParams({
-
@ApiImplicitParam(name = "groupid", value = "组ID", required = true ,dataType = "string",paramType = "query")
-
})
-
public AjaxResult
getDbFaceCount
(@RequestParam(defaultValue = "groupid") String groupid)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.getDbFaceCount(groupid));
-
}
-
-
@ApiOperation(value="用户入组",notes="用户入组")
-
@PostMapping(value = "/addUser")
-
public AjaxResult
addUser
(@RequestBody UserFace face)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.addUser(face));
-
}
-
-
@ApiOperation(value="用户更新",notes="用户更新")
-
@PostMapping(value = "/updateUser")
-
public AjaxResult
updateUser
(@RequestBody UserFace face)
throws Exception
-
{
-
return AjaxResult.success(m_FaceLibLocal.updateUser(face));
-
}
-
-
@ApiOperation(value="上传图像", notes="上传图像")
-
@RequestMapping(value="/uploadImage",method = RequestMethod.POST)
-
@ResponseBody
-
public Map<String,Object>
uploadImg
(@RequestParam(value="filename", required=false) MultipartFile file)
throws Exception
-
{
-
Map<String,Object> map =
new
HashMap<String,Object>();
-
if (file.isEmpty()) {
-
map.put(
"status",
0);
-
map.put(
"message",
"上传失败,请选择文件");
-
return map;
-
}
-
-
try {
-
// String fileName = file.getOriginalFilename();
-
String
fileSuffix
= file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(
"."));
-
String
fileName
= UUID.randomUUID() + fileSuffix;
-
-
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat(
"yyyy/MM/dd");
-
String
currentDate
= dateFormat.format(
new
Date() );
-
String
filePath
= upload_path +
"/" + currentDate +
"/";
-
if(FileUtil.createDir(filePath))
-
{
-
filePath += fileName;
-
File
dest
=
new
File(filePath);
-
file.transferTo(dest);
-
-
map.put(
"status",
200);
-
map.put(
"message",
"上传成功");
-
map.put(
"data", filePath);
-
}
else {
-
map.put(
"status",
5001);
-
map.put(
"message",
"上传失败");
-
map.put(
"data",
"创建文件夹失败");
-
}
-
-
}
catch(Exception e) {
-
map.put(
"status",
5002);
-
map.put(
"message",
"上传失败");
-
map.put(
"data", e.getMessage());
-
}
-
return map;
-
}
-
-
}
-
package com.ai.local;
-
-
import org.opencv.core.Core;
-
import org.opencv.core.Mat;
-
import org.opencv.core.MatOfByte;
-
import org.opencv.imgcodecs.Imgcodecs;
-
import org.springframework.stereotype.Component;
-
import com.ai.local.entity.UserFace;
-
import com.jni.face.Face;
-
import com.util.ImageTools;
-
-
@Component
-
public
class
FaceLibLocal {
-
/** 获取组列表 */
-
public String
getGroupList
(int pageStart, int pageSize)
throws Exception {
-
return Face.getGroupList(pageStart, pageSize);
-
}
-
-
/** 添加组 */
-
public String
addGroup
(String groupId)
throws Exception{
-
return Face.groupAdd(groupId);
-
}
-
-
/** 删除组 */
-
public String
removeGroup
(String groupId)
throws Exception{
-
return Face.groupDelete(groupId);
-
}
-
-
/** 获取某组的用户列表 */
-
public String
getUserList
(String groupId, int pageStart, int pageSize)
throws Exception{
-
return Face.getUserList(groupId, pageStart, pageSize);
-
}
-
-
/** 用户入组 */
-
public String
addUser
(UserFace uf)
throws Exception{
-
byte[] bytes = ImageTools.loadNetImage(uf.getImage());
-
MatOfByte
mb
=
new
MatOfByte(bytes);
-
Mat
mat
= Imgcodecs.imdecode(mb, -
1);
-
// Imgcodecs.imwrite("jerry.png", mat);
-
long
matAddr
= mat.getNativeObjAddr();
-
String
res
= Face.userAddByMat(matAddr, uf.getUserId(), uf.getGroupId(), uf.getUserInfo());
-
Face.loadDbFace();
-
return res;
-
}
-
-
/** 用户删除 */
-
public String
removeUser
(String userId, String groupId)
throws Exception{
-
String
res
= Face.userDelete(userId, groupId);
-
Face.loadDbFace();
-
return res;
-
}
-
-
/** 用户更新 */
-
public String
updateUser
(UserFace uf)
throws Exception{
-
byte[] bytes = ImageTools.loadNetImage(uf.getImage());
-
MatOfByte
mb
=
new
MatOfByte(bytes);
-
Mat
mat
= Imgcodecs.imdecode(mb, -
1);
-
// Imgcodecs.imwrite("jerry.png", mat);
-
long
matAddr
= mat.getNativeObjAddr();
-
String
res
= Face.userUpdate(matAddr, uf.getUserId(), uf.getGroupId(), uf.getUserInfo());
-
Face.loadDbFace();
-
return res;
-
}
-
-
/** 获取用户详情 */
-
public String
getUser
(String userId, String groupId)
throws Exception{
-
return Face.getUserInfo(userId, groupId);
-
}
-
-
/** 获取人脸数量 */
-
public
int
getDbFaceCount
(String groupId)
throws Exception{
-
return Face.dbFaceCount(groupId);
-
}
-
-
}
(4)对象实体
-
package com.ai.local.entity;
-
-
import com.jni.struct.Attribute;
-
import com.jni.struct.FeatureInfo;
-
import io.swagger.annotations.ApiModel;
-
-
@ApiModel(value = "FaceAttribute", description = "人脸识别结果")
-
public
class
FaceAttribute
extends
FeatureInfo {
-
// 人脸属性
-
Attribute[] attribute;
-
// 库搜索结果
-
String identify;
-
// 口罩
-
float wearMask;
-
-
public
FaceAttribute
() {
-
-
}
-
-
public
FaceAttribute
(FeatureInfo featureInfo) {
-
this.box = featureInfo.box;
-
this.feature = featureInfo.feature;
-
}
-
-
public Attribute[] getAttribute() {
-
return attribute;
-
}
-
public
void
setAttribute
(Attribute[] attribute) {
-
this.attribute = attribute;
-
}
-
public String
getIdentify
() {
-
return identify;
-
}
-
public
void
setIdentify
(String identify) {
-
this.identify = identify;
-
}
-
-
public
float
getWearMask
() {
-
return wearMask;
-
}
-
-
public
void
setWearMask
(float wearMask) {
-
this.wearMask = wearMask;
-
}
-
-
}
-
package com.ai.local.entity;
-
-
import io.swagger.annotations.ApiModel;
-
-
@ApiModel(value = "UserFace", description = "人脸库对象")
-
public
class
UserFace {
-
// 人脸图像
-
private String image;
-
// 用户id
-
private String userId;
-
// 组id
-
private String groupId;
-
// 其它信息
-
private String userInfo;
-
-
public String
getImage
() {
-
return image;
-
}
-
public
void
setImage
(String image) {
-
this.image = image;
-
}
-
public String
getUserId
() {
-
return userId;
-
}
-
public
void
setUserId
(String userId) {
-
this.userId = userId;
-
}
-
public String
getGroupId
() {
-
return groupId;
-
}
-
public
void
setGroupId
(String groupId) {
-
this.groupId = groupId;
-
}
-
public String
getUserInfo
() {
-
return userInfo;
-
}
-
public
void
setUserInfo
(String userInfo) {
-
this.userInfo = userInfo;
-
}
-
}
(5)摄像头切图识别
-
package com.task;
-
-
import java.io.IOException;
-
import java.time.LocalDateTime;
-
import java.time.ZoneOffset;
-
import java.util.ArrayList;
-
import java.util.HashMap;
-
import java.util.List;
-
import java.util.Map;
-
import java.util.UUID;
-
import org.opencv.core.Mat;
-
import org.opencv.core.Size;
-
import org.opencv.imgcodecs.Imgcodecs;
-
import org.opencv.imgproc.Imgproc;
-
import org.opencv.videoio.VideoCapture;
-
import org.apache.http.io.EofSensor;
-
import org.json.JSONObject;
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.scheduling.annotation.EnableAsync;
-
import org.springframework.stereotype.Component;
-
import com.ai.local.entity.FaceAttribute;
-
import com.jni.face.Face;
-
import com.jni.face.FaceDraw;
-
import com.jni.struct.FeatureInfo;
-
import com.util.GsonUtils;
-
import com.util.HttpUtil;
-
-
/**
-
*@author created by Jerry
-
*@date 2022年11月15日---上午9:14:56
-
*@problem
-
*@answer
-
*@action
-
*/
-
@Component
-
@EnableAsync
-
public
class
CamersLocalTask
implements
Runnable{
-
private
Logger
m_log
= LoggerFactory.getLogger(CamersLocalTask.class);
-
-
@Value("${rtspURL}")
-
String m_rtspURL;
-
-
@Value("${rtspImage}")
-
String m_rtspImage;
-
-
@Value("${rtspImage_down}")
-
String m_rtspImage_down;
-
-
@Value("${samplingRate}")
-
Long m_samplingRate;
-
-
@Value("${sendURL}")
-
String m_sendURL;
-
-
@Autowired
-
HttpUtil m_HttpUtil;
-
-
@Override
-
public
void
run
() {
-
try {
-
this.screenshot_ex();
-
}
catch (java.lang.Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
/** 摄像头截图 */
-
public
void
screenshot_ex
()
throws IOException {
-
// 内存不能实时释放,尽量不new
-
VideoCapture
capture
=
new
VideoCapture();
-
capture.open(m_rtspURL);
-
capture.set(
3,
960);
-
capture.set(
4,
540);
-
if (!capture.isOpened()) {
-
m_log.error(
"ERROR:could not open camera {}", m_rtspURL);
-
return;
-
}
-
// type 0: 表示rgb 人脸检测 1:表示nir人脸检测
-
int
type
=
0;
-
Mat
frame
=
new
Mat();
-
int
index
=
0;
-
while (
true) {
-
boolean
have
= capture.read(frame);
-
if (!have) {
-
m_log.error(
"切图失败");
-
capture.release();
-
capture.open(m_rtspURL);
-
continue;
-
}
-
-
// 切一下 resize(原矩阵,新矩阵,宽,高)
-
Imgproc.resize(frame, frame,
new
Size(
960,
540));
-
// 截一下 submat(起始行,截止行,起始列,截止列)
-
// frame = frame.submat(20, 540 - 88, 96, 960 - 96);
-
-
if(index++ < m_samplingRate)
-
{
-
continue;
-
}
-
index =
0;
-
-
if (!frame.empty()) {
-
long
matAddr
= frame.getNativeObjAddr();
-
// 获取特征
-
FeatureInfo[] featureInfo = Face.faceFeature(matAddr, type);
-
if (featureInfo ==
null || featureInfo.length <=
0) {
-
// m_log.info("无人脸");
-
continue;
-
}
-
List<FaceAttribute> eatureInfoList =
new
ArrayList<>();
-
for (
int
i
=
0; i < featureInfo.length; i++) {
-
FeatureInfo
fi
= featureInfo[i];
-
FaceAttribute
faceAttribute
=
new
FaceAttribute(fi);
-
// 抠图
-
Mat
mat_sub
=
new
Mat();
-
long
outAddr
= mat_sub.getNativeObjAddr();
-
Face.faceCrop(matAddr, outAddr);
-
// 属性
-
faceAttribute.setAttribute(Face.faceAttr(outAddr));
-
// 口罩
-
faceAttribute.setWearMask(Face.faceMouthMask(outAddr)[
0]);
-
// 搜索
-
faceAttribute.setIdentify(Face.identifyWithAll(fi.feature, type).replaceAll(
"\\n|\\t",
""));
-
// 绘制
-
FaceDraw.drawRects(frame, fi.box);
-
eatureInfoList.add(faceAttribute);
-
-
mat_sub =
null;
-
}
-
-
// 保存
-
String
fname
= UUID.randomUUID().toString() +
".jpg";
-
Imgcodecs.imwrite(m_rtspImage + fname, frame);
-
-
// 发送
-
Long
timestamp
= LocalDateTime.now().toInstant(ZoneOffset.of(
"+8")).toEpochMilli()/
1000;
-
JSONObject
jo
=
new
JSONObject();
-
jo.put(
"error_code",
0);
-
jo.put(
"img_src", m_rtspImage_down + fname);
-
String
str
= GsonUtils.toJson(eatureInfoList);
-
jo.put(
"face_list", str);
-
jo.put(
"log_id", timestamp);
-
jo.put(
"timestamp", timestamp);
-
-
Map<String, Object> map =
new
HashMap<>();
-
map.put(
"JsonData", GsonUtils.toJson(jo));
-
map.put(
"UseState",
0);
-
map.put(
"CreateDate", LocalDateTime.now().toString());
-
String
param
= GsonUtils.toJson(map);
-
-
try {
-
m_HttpUtil.postAsync(m_sendURL, param);
-
m_log.info(
"INFO::向{}推发送数据成功{}",m_sendURL, param);
-
}
catch (java.lang.Exception e) {
-
m_log.error(
"ERROR::向{}推送数据失败 ",m_sendURL);
-
}
-
-
eatureInfoList =
null;
-
jo =
null;
-
map =
null;
-
System.gc();
-
}
-
}
-
}
-
-
}
(6)清理临时存储
-
package com.task;
-
-
import java.io.File;
-
import java.io.IOException;
-
import java.nio.file.Files;
-
import java.nio.file.Path;
-
import java.nio.file.Paths;
-
import java.nio.file.attribute.BasicFileAttributes;
-
import java.nio.file.attribute.FileTime;
-
import java.time.LocalDateTime;
-
import java.time.ZoneOffset;
-
import java.util.ArrayList;
-
import java.util.List;
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.scheduling.annotation.EnableAsync;
-
import org.springframework.stereotype.Component;
-
-
/**
-
*@author created by Jerry
-
*@date 2022年11月15日---上午9:14:56
-
*@problem
-
*@answer
-
*@action
-
*/
-
@Component
-
@EnableAsync
-
public
class
ClearFilesTask
implements
Runnable{
-
Logger
m_log
= LoggerFactory.getLogger(ClearFilesTask.class);
-
-
@Value("${cacheTime}")
-
Long m_cacheTime;
-
-
@Value("${rtspImage}")
-
String m_rtspImage;
-
-
@Override
-
public
void
run
() {
-
while (
true) {
-
try {
-
File
file
=
new
File(m_rtspImage);
-
List<File> objects =
new
ArrayList<File>();
-
getFilesList(file, objects);
-
Thread.sleep(
1000L *
300);
-
}
catch (IOException | InterruptedException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
-
private
void
getFilesList
(File file, List<File> temp)
throws IOException{
-
File[] listFiles = file.listFiles();
-
if(listFiles ==
null) {
-
return;
-
}
-
for (File file2 : listFiles) {
-
if (file2.isDirectory()) {
-
getFilesList(file2, temp);
-
}
else {
-
if(file2.getAbsolutePath().contains(
".jpg")){
-
Path
path
= Paths.get(file2.getAbsolutePath());
-
BasicFileAttributes
attrs
= Files.readAttributes(path, BasicFileAttributes.class);
-
FileTime
fileTime
= attrs.creationTime();
-
if(LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) -
28800 - fileTime.toMillis()/
1000 > m_cacheTime) {
-
file2.delete();
-
}
-
}
-
}
-
}
-
}
-
}
转载:https://blog.csdn.net/zj850324/article/details/128422431
查看评论