上传人脸图片到人脸库

controller:

@RestController
@RequestMapping("/facePicture")
public class FacePictureHandleController {@Autowiredprivate FacePictureHandleService facePictureHandleService;@RequestMapping(value = "/handle/uploadFile")public String padUploadFile(@RequestParam("file") MultipartFile file,HttpServletRequest request) {try {FacePicture facePicture=new FacePicture();HttpSession session = request.getSession(true);Map<String, String> userInfo = (Map<String, String>) session.getAttribute(SessionConstants.SESSION_KEY_USER_INFO);facePicture.setCardId(userInfo.get("loginUser"));File f=null;String fileName = file.getOriginalFilename();try {//获取文件字节数组byte [] bytes = file.getBytes();File pfile = new File("/fileupload/");//判断文件夹是否存在if(!pfile.exists()){//不存在时,创建文件夹pfile.mkdirs();}//创建文件f = new File(pfile, fileName);//写入指定文件夹OutputStream out = new FileOutputStream(f);out.write(bytes);} catch (IOException e) {e.printStackTrace();return "上传失败";}Integer facePictureRes = facePictureHandleService.saveFacePictureHandle(facePicture,f.getPath());if(facePictureRes==0){return "上传失败";}return "上传成功";} catch (Exception e) {log.error("上传文件异常", e);}return "上传失败";}
}

service:

@Service
public class FacePictureHandleService {/***配置文件*/@Value("${groupId}")private String groupId;@Value("${uploadWaitTime}")private int uploadWaitTime;@Value("${groupName}")private String groupName;@Autowiredprivate FacePictureHandleDao facePictureHandleDao;@Autowiredprivate FaceDetectService faceDetectService;@Autowiredprivate UserInfoDAO userInfoDao;/*** 保存人脸图片到人脸库* @return*/public Integer saveFacePictureHandle(FacePicture facePicture, String filePath) throws UnsupportedEncodingException {Memory fileMemory=new Memory(2000000);try {ToolKits.ReadAllFileToMemory(filePath,fileMemory);} catch (IOException e) {e.printStackTrace();}List<UserInfo> byUserNameIn = userInfoDao.findByUserNameIn(Collections.singletonList(facePicture.getCardId()));facePicture.setName(byUserNameIn.get(0).getName());facePicture.setFaceDatabaseName(groupName);String gender = byUserNameIn.get(0).getGender();int sex=0;if("F".equals(gender)){sex=2;}else if("M".equals(gender)){sex=1;}Long  fId= facePictureHandleDao.queryFaceDatabaseId(facePicture.getCardId());if(fId==null){ //未上传图片//上传图片到人脸库boolean updalodRes = addPerson(groupId, fileMemory, facePicture.getName(), sex, false, "", 0, "",facePicture);if(updalodRes){facePictureHandleDao.save(facePicture);return 1;}}else{ //已上传过图片String uId = facePictureHandleDao.queryFaceDatabaseUid(fId);//修改人脸库图片boolean updalodRes = modifyPerson(groupId, uId,fileMemory, facePicture.getName(), sex, false, "", 0, "");if(updalodRes){facePicture.setId(fId);int i = facePictureHandleDao.updatePictureData(fId);return i;}}File file=new File(filePath);if(file!=null){file.deleteOnExit();}return 0;}public File transferToFile(MultipartFile multipartFile) {File file = null;try {String originalFilename = multipartFile.getOriginalFilename();String[] filename = originalFilename.split("\\.");file=File.createTempFile(filename[0]+"temp", filename[1]);multipartFile.transferTo(file);} catch (IOException e) {e.printStackTrace();}return file;}/*** 添加人员* @param groupId  人脸库ID* @param memory  图片数据* @param personName 姓名* @param sex  性别* @param isBirthday 是否下发生日* @param birthday  生日* @param byIdType  证件类型* @param idNo  证件号* @return*/public  boolean addPerson(String groupId,Memory memory,String personName,int sex,boolean isBirthday,String birthday,int byIdType,String idNo,FacePicture facePicture) throws UnsupportedEncodingException {/**  入参*/NetSDKLib.NET_IN_OPERATE_FACERECONGNITIONDB stuIn  = new NetSDKLib.NET_IN_OPERATE_FACERECONGNITIONDB();stuIn.emOperateType = NetSDKLib.EM_OPERATE_FACERECONGNITIONDB_TYPE.NET_FACERECONGNITIONDB_ADD;/ 使用人员扩展信息 //stuIn.bUsePersonInfoEx = 1;// 人脸库IDSystem.arraycopy(groupId.getBytes(), 0, stuIn.stPersonInfoEx.szGroupID, 0, groupId.getBytes().length);// 生日设置if(isBirthday) {String[] birthdays = birthday.split("-");stuIn.stPersonInfoEx.wYear = (short)Integer.parseInt(birthdays[0]);stuIn.stPersonInfoEx.byMonth = (byte)Integer.parseInt(birthdays[1]);stuIn.stPersonInfoEx.byDay = (byte)Integer.parseInt(birthdays[2]);}// 性别,1-男,2-女,作为查询条件时,此参数填0,则表示此参数无效stuIn.stPersonInfoEx.bySex = (byte)sex;// 人员名字try {System.arraycopy(personName.getBytes("GBK"), 0, stuIn.stPersonInfoEx.szPersonName, 0, personName.getBytes("GBK").length);} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 证件类型stuIn.stPersonInfoEx.byIDType = (byte)byIdType;// 证件号System.arraycopy(idNo.getBytes(), 0, stuIn.stPersonInfoEx.szID, 0, idNo.getBytes().length);// 图片张数、大小、缓存设置if(memory != null) {stuIn.stPersonInfoEx.wFacePicNum = 1; // 图片张数stuIn.stPersonInfoEx.szFacePicInfo[0].dwFileLenth = (int)memory.size();  // 图片大小stuIn.stPersonInfoEx.szFacePicInfo[0].dwOffSet = 0;stuIn.nBufferLen = (int)memory.size();stuIn.pBuffer = memory;}/** 出参*/NetSDKLib.NET_OUT_OPERATE_FACERECONGNITIONDB stuOut = new NetSDKLib.NET_OUT_OPERATE_FACERECONGNITIONDB() ;stuIn.write();boolean bRet = faceDetectService.getNetsdk().CLIENT_OperateFaceRecognitionDB(faceDetectService.getLoginHandle(), stuIn, stuOut, uploadWaitTime);stuIn.read();if(bRet) {System.out.println("szUID : " + new String(stuOut.szUID).trim());} else {System.err.println(faceDetectService.netsdk.CLIENT_GetLastError());}facePicture.setFaceDatabaseUid(new String(stuOut.szUID, "GBK").trim());return bRet;}/*** 修改人员信息* @param groupId 人脸库ID* @param uid  人员唯一标识符* @param memory  图片数据* @param personName  姓名* @param sex  性别* @param isBirthday  是否下发生日* @param birthday  生日* @param byIdType  证件类型* @param idNo  证件号* @return true:成功 ,  false:失败*/public  boolean modifyPerson(String groupId,String uid,Memory memory,String personName,int sex,boolean isBirthday,String birthday,int byIdType,String idNo) {// 入参NetSDKLib.NET_IN_OPERATE_FACERECONGNITIONDB stuIn  = new NetSDKLib.NET_IN_OPERATE_FACERECONGNITIONDB();stuIn.emOperateType = NetSDKLib.EM_OPERATE_FACERECONGNITIONDB_TYPE.NET_FACERECONGNITIONDB_MODIFY;/ 使用人员扩展信息  stuIn.bUsePersonInfoEx = 1;// 人脸库IDSystem.arraycopy(groupId.getBytes(), 0, stuIn.stPersonInfoEx.szGroupID, 0, groupId.getBytes().length);// 人员唯一标识符System.arraycopy(uid.getBytes(), 0, stuIn.stPersonInfoEx.szUID, 0, uid.getBytes().length);// 生日设置if(isBirthday) {String[] birthdays = birthday.split("-");stuIn.stPersonInfoEx.wYear = (short)Integer.parseInt(birthdays[0]);stuIn.stPersonInfoEx.byMonth = (byte)Integer.parseInt(birthdays[1]);stuIn.stPersonInfoEx.byDay = (byte)Integer.parseInt(birthdays[2]);}// 性别,1-男,2-女,作为查询条件时,此参数填0,则表示此参数无效stuIn.stPersonInfoEx.bySex = (byte)sex;// 人员名字try {System.arraycopy(personName.getBytes("GBK"), 0, stuIn.stPersonInfoEx.szPersonName, 0, personName.getBytes("GBK").length);} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 证件类型stuIn.stPersonInfoEx.byIDType = (byte)byIdType;// 证件号System.arraycopy(idNo.getBytes(), 0, stuIn.stPersonInfoEx.szID, 0, idNo.getBytes().length);// 图片张数、大小、缓存设置if(memory != null) {stuIn.stPersonInfoEx.wFacePicNum = 1; // 图片张数stuIn.stPersonInfoEx.szFacePicInfo[0].dwFileLenth = (int)memory.size();  // 图片大小stuIn.stPersonInfoEx.szFacePicInfo[0].dwOffSet = 0;stuIn.nBufferLen = (int)memory.size();stuIn.pBuffer = memory;}// 出参NetSDKLib.NET_OUT_OPERATE_FACERECONGNITIONDB stuOut = new NetSDKLib.NET_OUT_OPERATE_FACERECONGNITIONDB() ;stuIn.write();boolean b = faceDetectService.getNetsdk().CLIENT_OperateFaceRecognitionDB(faceDetectService.getLoginHandle(), stuIn, stuOut, uploadWaitTime);if(!b) {System.err.println("修改人员失败" + ToolKits.getErrorCodePrint());return false;}stuIn.read();return true;}/*** 查询人脸库* @param groupId 需要查找的人脸库ID; 为空表示查找所有的人脸库*/public  NetSDKLib.NET_FACERECONGNITION_GROUP_INFO[] findGroupInfo(String groupId) {NetSDKLib.NET_FACERECONGNITION_GROUP_INFO[] groupInfoRet = null;/** 入参*/NetSDKLib.NET_IN_FIND_GROUP_INFO stuIn = new NetSDKLib.NET_IN_FIND_GROUP_INFO();System.arraycopy(groupId.getBytes(), 0, stuIn.szGroupId, 0, groupId.getBytes().length);/** 出参*/int max = 20;NetSDKLib.NET_FACERECONGNITION_GROUP_INFO[] groupInfo  = new NetSDKLib.NET_FACERECONGNITION_GROUP_INFO[max];for(int i = 0; i < max; i++) {groupInfo[i] = new NetSDKLib.NET_FACERECONGNITION_GROUP_INFO();}NetSDKLib.NET_OUT_FIND_GROUP_INFO stuOut = new NetSDKLib.NET_OUT_FIND_GROUP_INFO();stuOut.pGroupInfos = new Memory(groupInfo[0].size() * groupInfo.length);     // Pointer初始化stuOut.pGroupInfos.clear(groupInfo[0].size() * groupInfo.length);stuOut.nMaxGroupNum = groupInfo.length;ToolKits.SetStructArrToPointerData(groupInfo, stuOut.pGroupInfos);  // 将数组内存拷贝给Pointerif(faceDetectService.netsdk.CLIENT_FindGroupInfo(faceDetectService.getLoginHandle(), stuIn, stuOut, 4000)) {// 将Pointer的值输出到 数组 NET_FACERECONGNITION_GROUP_INFOToolKits.GetPointerDataToStructArr(stuOut.pGroupInfos, groupInfo);if(stuOut.nRetGroupNum > 0) {// 根据设备返回的,将有效的人脸库信息返回groupInfoRet = new NetSDKLib.NET_FACERECONGNITION_GROUP_INFO[stuOut.nRetGroupNum];for(int i = 0; i < stuOut.nRetGroupNum; i++) {groupInfoRet[i] = groupInfo[i];}}} else {System.err.println("查询人员信息失败" + ToolKits.getErrorCodePrint());return null;}return groupInfoRet;}
}

Dao(JPA):

@Repository
public interface FaceDatabasePictureDao  extends CrudRepository<FacePicture, String> {//查询是否已上传过图片@Query("select id from FacePicture where  cardId=?")public Long queryFaceDatabaseId(String cardId);//查询是否已上传过图片@Query("select faceDatabaseUid from FacePicture where  id=?")public String queryFaceDatabaseUid(Long id);@Modifying@Query(value="update FacePicture set updatedDate=sysdate()  where id=?")@Transactionalpublic  int updatePictureData(Long id);
}

人脸识别对比

由于项目启动时就要启动,使用@PostConstruct注解。

service:

@Service
public class FaceDetectService{@Value("${mstrIp}")private String m_strIp;@Value("${mnPort}")private int m_nPort;@Value("${mstrUser}")private String m_strUser;@Value("${mstrPassword}")private String m_strPassword;private static boolean bInit = false;private static boolean bLogopen = false;@Autowiredprivate FaceDetectDao faceDetectDaoA;private static FaceDetectDao faceDetectDao;@PostConstructpublic void init() {faceDetectDao=this.faceDetectDaoA;//初始化InitTest(disConnect, haveReConnect);//登录Login();Run();}public NetSDKLib getNetsdk(){return netsdk;}public NetSDKLib.LLong getLoginHandle(){return loginHandle;}public static final NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;// 登陆句柄public static  NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0);// 订阅句柄private static NetSDKLib.LLong r_loginHandle = new NetSDKLib.LLong(0);// 设备信息扩展private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();// 全景图private static BufferedImage globalBufferedImage = null;// 人脸图private static BufferedImage personBufferedImage = null;// 候选人图private static BufferedImage candidateBufferedImage = null;// 用于人脸检测@Value("${face.groupId}")private  int groupId;@Value("${face.channel}")private  int channel;@Value("${face.bNeedPicture}")private  int bNeedPicture;private static int index = -1;// 设备断线通知回调private static DisConnect disConnect = new DisConnect();// 网络连接恢复private static HaveReConnect haveReConnect = new HaveReConnect();public void Run() {//订阅RealLoadPicture(channel, bNeedPicture, AnalyzerDataCB.getInstance());}// 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数private static class DisConnect implements NetSDKLib.fDisConnect {public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);}}// 网络连接恢复,设备重连成功回调// 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数private static class HaveReConnect implements NetSDKLib.fHaveReConnect {public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);}}/*** 写成静态主要是防止被回收*/private static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {private AnalyzerDataCB() {}private static class AnalyzerDataCBHolder {private static final FaceDetectService.AnalyzerDataCB instance = new FaceDetectService.AnalyzerDataCB();}public static FaceDetectService.AnalyzerDataCB getInstance() {return FaceDetectService.AnalyzerDataCB.AnalyzerDataCBHolder.instance;}public int invoke(NetSDKLib.LLong lAnalyzerHandle,int dwAlarmType,Pointer pAlarmInfo,Pointer pBuffer,int dwBufSize,Pointer dwUser,int nSequence,Pointer reserved) {if (lAnalyzerHandle.longValue() == 0 || pAlarmInfo == null) {return -1;}switch (dwAlarmType) {case NetSDKLib.EVENT_IVS_FACERECOGNITION: // /< 人脸识别事件{// DEV_EVENT_FACERECOGNITION_INFO 结构体比较大,new对象会比较耗时, ToolKits.GetPointerData内容拷贝是不耗时的。// 如果多台设备或者事件处理比较频繁,可以考虑将 static DEV_EVENT_FACERECOGNITION_INFO msg = new// DEV_EVENT_FACERECOGNITION_INFO(); 改为全局。// 写成全局,是因为每次new花费时间较多, 如果改为全局,此case下的处理需要加锁// 加锁,是因为共用一个对象,防止数据出错// 耗时800ms左右NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO msg = new NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO();// 耗时20ms左右ToolKits.GetPointerData(pAlarmInfo, msg);//保存人脸对比信息try {saveFaceDetectInfo(msg);} catch (IOException e) {e.printStackTrace();}// 释放内存msg = null;System.gc();break;}default:break;}return 0;}/*** 保存人脸对比信息*/public void saveFaceDetectInfo(NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO faceMsg) throws IOException {//人脸信息if (faceMsg.stuFaceData != null) {Res res=new Res();FaceDetect faceDetect =new FaceDetect();faceDetect.setName(new String(faceMsg.stuCandidatesEx[0].stPersonInfo.szPersonName, "GBK").trim());faceDetect.setSex(res.getSex(faceMsg.stuFaceData.emSex));faceDetect.setDetectTime(Timestamp.valueOf(faceMsg.UTC.toString()));faceDetect.setFaceDatabaseName(new String(faceMsg.stuCandidatesEx[0].stPersonInfo.szGroupName, "GBK").trim());faceDetect.setSimilarity(String.valueOf(faceMsg.stuCandidatesEx[0].bySimilarity));faceDetect.setFaceDatabaseUid(new String(faceMsg.stuCandidatesEx[0].stPersonInfo.szUID).trim());faceDetectDao.save(faceDetect);}};}// 订阅public void RealLoadPicture(int channel, int bNeedPicture, NetSDKLib.fAnalyzerDataCallBack callback) {r_loginHandle = netsdk.CLIENT_RealLoadPictureEx(loginHandle, channel,NetSDKLib.EVENT_IVS_ALL, bNeedPicture, callback, null, null);if (loginHandle.longValue() == 0) {System.err.println("CLIENT_RealLoadPictureEx Failed, Error:" + ToolKits.getErrorCodePrint());} else {System.out.println("通道[" + channel + "]订阅成功!");}}//初始化public static boolean InitTest(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) {bInit = netsdk.CLIENT_Init(disConnect, null);if (!bInit) {System.out.println("Initialize SDK failed");return false;}//打开日志,可选NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();File path = new File("./sdklog/");if (!path.exists()) {path.mkdir();}String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log";setLog.nPrintStrategy = 0;setLog.bSetFilePath = 1;System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);System.out.println(logPath);setLog.bSetPrintStrategy = 1;bLogopen = netsdk.CLIENT_LogOpen(setLog);if (!bLogopen) {System.err.println("Failed to open NetSDK log");}// 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作// 此操作为可选操作,但建议用户进行设置netsdk.CLIENT_SetAutoReconnect(haveReConnect, null);//设置登录超时时间和尝试次数,可选int waitTime = 5000; //登录请求响应超时时间设置为5Sint tryTimes = 1;    //登录时尝试建立链接1次netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);// 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime// 接口设置的登录设备超时时间和尝试次数意义相同,可选NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();netParam.nConnectTime = 10000;      // 登录时尝试建立链接的超时时间netParam.nGetConnInfoTime = 3000;   // 设置子连接的超时时间netParam.nGetDevInfoTime = 3000;//获取设备信息超时时间,为0默认1000msnetsdk.CLIENT_SetNetworkParam(netParam);return true;}//登陆public void Login() {// 登陆设备int nSpecCap = NetSDKLib.EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP;    // TCP登入IntByReference nError = new IntByReference(0);loginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser,m_strPassword, nSpecCap, null, deviceInfo, nError);if (loginHandle.longValue() != 0) {System.out.printf("Login Device[%s] Success!\n", m_strIp);} else {System.err.printf("Login Device[%s] Fail.Error[0x%x]\n", m_strIp, netsdk.CLIENT_GetLastError());LoginOut();}}//登出public void LoginOut() {if (loginHandle.longValue() != 0) {netsdk.CLIENT_Logout(loginHandle);}System.out.println("END...");netsdk.CLIENT_Cleanup();}/*** 设备断线回调*/private static class DisConnectCallBack implements NetSDKLib.fDisConnect {private DisConnectCallBack() {}private static class CallBackHolder {private static FaceDetectService.DisConnectCallBack instance = new FaceDetectService.DisConnectCallBack();}public static FaceDetectService.DisConnectCallBack getInstance() {return FaceDetectService.DisConnectCallBack.CallBackHolder.instance;}public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);}}/*** 设备重连回调*/private static class HaveReConnectCallBack implements NetSDKLib.fHaveReConnect {private HaveReConnectCallBack() {}private static class CallBackHolder {private static FaceDetectService.HaveReConnectCallBack instance = new FaceDetectService.HaveReConnectCallBack();}public static FaceDetectService.HaveReConnectCallBack getInstance() {return FaceDetectService.HaveReConnectCallBack.CallBackHolder.instance;}public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);}}
}

Dao(JPA):

@Repository
public interface FaceDetectDao extends CrudRepository<FaceDetect, String> {}

注意:

1、上传图片到人脸库时有一个问题,修改人员信息时,修改的图片与上一个图片是同一张时时会导致图片是空的(不知道什么原因)。

2、new Memory设置太大会导致超时。

大华sdk(java)上传人脸图片到人脸库,订阅人脸识别对比相关推荐

  1. JAVA上传文件图片到服务器保存

    这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的   我这是提交一个文件和类型 <div style="border: 1px solid ...

  2. 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决

    文章目录 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 2.解决方案 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 上传的文件,未指定文件访 ...

  3. java上传文件图片到服务器保存,Java上传文件图片到服务器的方法

    这里我记录一个比较简单方便操作的java上传文件图片到服务器并且保存,具体内容如下 首先是页面html的   我这是提交一个文件和类型 我是添加一张临时图片得到微信的media_id保存数据库! en ...

  4. java 上传的图片大小为0_JAVA技术:上传图片的缩放处理

    图片上传到后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理. 下面的程序使用jdk1.4中最新的ImageIO对图片进行读写.使用AffineTra ...

  5. 大华SDK java实现车位和违停事件

    写在前面 gitee地址如下: Gitee仓库传送门 大华SDK分语言和操作系统,不同的SDK实现方式不太一样,需要先根据自己的需求进行SDK的选取.比如,很多线上服务是部署在Linux系统的,所以开 ...

  6. 大华SDK+JAVA+4g网络摄像头进行二次开发

    前言 监控,相信大家都不陌生.现在的监控技术发展迅速,国内以海康威视为首的智能视频监控提供商也层出不穷.现在,这些提供商都已经提供了相应的SDK以及API接口,能够很好的支撑我们进行摄像机的二次开发工 ...

  7. java上传文件图片

    别忘记更换包名 注意需要下载两个包 apache官网下载即可 java页面 package com.jdbc.servlet;import java.io.File; import java.io.F ...

  8. java 上传远程图片,java上传图片到另一台服务器上,怎么解决

    Java codepublic String upload(String dir, FormFile formFile) throws Exception { Date date = new Date ...

  9. java 微信开发图片发送,微信开发?Java上传Base64图片

    class="java">import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Log ...

  10. java上传png_java图片上传

    1 /***2 * 上传证明材料3 *@paramfiles4 *@paramrequest5 *@return 6 */ 7 @RequestMapping(value = "/bitch ...

最新文章

  1. 3 css 奖品出现弹出动画_【技术】nuxt中引入wow和animate.css 页面随滚动条出现动画...
  2. 图的邻接矩阵简单实现Win32版本
  3. 【Top】Plan (updating...)
  4. is 和 == 的区别
  5. redis 哨兵 异步_突破Java面试(23-8) - Redis哨兵主备切换的数据丢失问题-阿里云开发者社区...
  6. create用法java_Java AcousticEchoCanceler.create方法代碼示例
  7. CentOS 6.2目录服务之LDAP(一)
  8. 【ArcGIS】数据属性重新赋值
  9. 互盾科技:博观而约取,厚积而薄发
  10. 准备写个linux下的千千静听
  11. 仓储物流系统初级架构
  12. VR、AR、MR以及数字孪生
  13. 文件夹删除了如何恢复?轻松恢复教学
  14. c语言编程答案,C语言编程答案
  15. 南安一中八十年校庆征文 陈建春老师
  16. 服务器和微内核系统哪个好,分析微内核架构操作系统优缺点
  17. 崔辰州:“数据驱动的天文科普”人生
  18. 扎克伯格 java_程序员的5种级别,扎克伯格比尔盖茨并非最高等级!
  19. 达人评测 高通骁龙765g和骁龙888有多大差别
  20. 树与二叉树——递归算法、非递归算法求二叉树的深度

热门文章

  1. C#数据结构与算法总结
  2. 借助Writage,将 Word 转换为 Markdown发表csdn博客
  3. bcdedit添加linux引导,强大的BCDEdit工具-启动项等相关问题-设置默认开机启动项
  4. 非全研究生业余研究:利用十一假期训练了室内定位模型
  5. 计算机网络(三)—— 数据链路层(7):MAC地址、IP地址以及数据链路层使用的ARP协议
  6. C# GDI+ 画心形 跳动动画
  7. 【推荐系统论文精读系列】(八)--Deep Crossing:Web-Scale Modeling without Manually Crafted Combinatorial Features
  8. RevitAPI: 当前视图为透视图的时候IdlingEvent不会被触发
  9. Intel 助力移动云百万 IOPS 云硬盘,打造极速云存储体验
  10. 计算机学报在线阅读,计算机学报CHIN.pdf