目录

1.介绍

2.登录设备

3.退出登录设备

4.云端→设备

5.设备→云端

6.公共方法、实体类


1.介绍

海康威视官方有对应的demo,该文章只是总结!

使用的wpf,数据库用的是mysql

主要使用的字段:文章中出现的base_user_extend是表名

字段 类型 注释
UserCode varchar 员工编号
UserName varchar 员工姓名
user_key varchar  
hk_face_info blob 人脸信息

2.登录设备

  1. 在App.config中添加配置:设备IP,设备管理员账号,管理员账号密码
  2. 登录设备
    <!--质量信息到人人脸设备地址 --><add key="sDeviceAddress" value="192.168.0.1"/><!--质量信息到人人脸识别登陆名 --><add key="sUserName" value="admin"/><!--质量信息到人人脸识别登陆密码 --><add key="sPassword" value="hk12356"/>
 public static int m_UserID = -1; public void Login(){if (m_UserID >= 0){CHCNetSDK.NET_DVR_Logout_V30(m_UserID);m_UserID = -1;}CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLoginInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();CHCNetSDK.NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();struDeviceInfoV40.struDeviceV30.sSerialNumber = new byte[CHCNetSDK.SERIALNO_LEN];struLoginInfo.sDeviceAddress = Global.GetAppSetting("sDeviceAddress");struLoginInfo.sUserName = Global.GetAppSetting("sUserName");struLoginInfo.sPassword = Global.GetAppSetting("sPassword");ushort.TryParse("8000", out struLoginInfo.wPort);int lUserID = -1;lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLoginInfo, ref struDeviceInfoV40);if (lUserID >= 0){m_UserID = lUserID;Logger.Log("人脸 :Login Successful");}else{lblMsg.Content = "同步设备信息失败";uint nErr = CHCNetSDK.NET_DVR_GetLastError();if (nErr == CHCNetSDK.NET_DVR_PASSWORD_ERROR){Logger.Error("user name or password error!");if (1 == struDeviceInfoV40.bySupportLock){Logger.Error(string.Format("Left {0} try opportunity", struDeviceInfoV40.byRetryLoginTime));}}else if (nErr == CHCNetSDK.NET_DVR_USER_LOCKED){if (1 == struDeviceInfoV40.bySupportLock){Logger.Error(string.Format("user is locked, the remaining lock time is {0}", struDeviceInfoV40.dwSurplusLockTime));}}else{Logger.Error($"Login fail error:{nErr} ");}}}

3.退出登录设备

/// <summary>/// 退出设备/// </summary>public void Logout(){try{if (m_UserID >= 0){CHCNetSDK.NET_DVR_Logout_V30(m_UserID);m_UserID = -1;}}catch (Exception ex){Logger.Error("人脸退出登录异常:" + ex.Message);}}

4.云端→设备

  1. 在设备创建用户,使用了BackgroundWorker

       public QTM_FaceInfo(){InitializeComponent();bw.WorkerReportsProgress = true;bw.DoWork += new DoWorkEventHandler(bw_DoWork);bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//进度改变事件bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);//进度完成事件}  //远端→设备  按钮代码private void Viewbtn_Click(object sender, RoutedEventArgs e){try{lblMsg.Visibility = Visibility.Visible;lblMsg.Content = "正在同步";Login();if (m_UserID >= 0){bw.RunWorkerAsync();}else{lblMsg.Content = "同步失败,无法打开设备端口";}}catch (Exception ex){Logger.Error("同步异常:" + ex.Message);lblMsg.Content = "同步异常,无法打开设备端口";}}#region BackgroundWorkerprivate int syncStatus = 0;void bw_DoWork(object sender, DoWorkEventArgs e){#region 创建用户//校验url信息bw.ReportProgress(1);int jindu = 1;bw.ReportProgress(jindu);List<base_user_extend> facelst = fingerlst.Where(x => !string.IsNullOrEmpty(x.hk_face_info)).ToList();foreach (var item in facelst){if (string.IsNullOrEmpty(item.user_key)){Logger.Error($"同步人脸信息:user_key为空!{item.UserCode}==={item.UserName}");}else{jindu = jindu + 1;int isuser = CreateUserInfo(item);if (syncStatus == 200){int iscard = CreateCardInfo(item);}if (syncStatus == 200){SendFaceData(item);}if (jindu < 9){bw.ReportProgress(jindu);}}}#endregion}private void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e){if (e.ProgressPercentage == 1){lblMsg.Content = "正在校验人脸设备信息,进度:10%";}if (e.ProgressPercentage > 1 && e.ProgressPercentage <= 8){lblMsg.Content = $"正在将设备信息传输到设备,进度:{e.ProgressPercentage * 10}%";}if (e.ProgressPercentage == 9){lblMsg.Content = "正在同步,进度:30%";}}void bw_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e){switch (syncStatus){case 200:lblMsg.Content = "同步人脸设备信息成功!";break;case 0:lblMsg.Content = "同步人脸设备信息失败!";break;case -1:lblMsg.Content = "同步人脸设备信息:设备创建用户失败!";break;case -2:lblMsg.Content = "同步人脸设备信息:设备创建用户卡号失败!";break;case -3:lblMsg.Content = "同步人脸设备信息:人脸数据添加失败!";break;}Logout();//lblMsg.Visibility = Visibility.Collapsed;}#endregionpublic Int32 m_lSetUserCfgHandle = -1;public Int32 m_lSetCardCfgHandle = -1;private int m_lSetFaceCfgHandle = -1;private int m_lGetFaceCfgHandle = -1;private List<base_user_extend> fingerlst;private BackgroundWorker bw = new BackgroundWorker();#region 创建用户/// <summary>/// 校验创建用户url/// </summary>private int CreateUserInfo(base_user_extend info){if (m_lSetUserCfgHandle != -1){if (CHCNetSDK.NET_DVR_StopRemoteConfig(m_lSetUserCfgHandle)){m_lSetUserCfgHandle = -1;}}string sURL = "PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json";IntPtr ptrURL = Marshal.StringToHGlobalAnsi(sURL);m_lSetUserCfgHandle = CHCNetSDK.NET_DVR_StartRemoteConfig(m_UserID, CHCNetSDK.NET_DVR_JSON_CONFIG, ptrURL, sURL.Length, null, IntPtr.Zero);if (m_lSetUserCfgHandle < 0){Logger.Error("NET_DVR_StartRemoteConfig fail [url:PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json] error:" + CHCNetSDK.NET_DVR_GetLastError());Marshal.FreeHGlobal(ptrURL);syncStatus = -1;return -1;}else{SendUserInfo(info);Marshal.FreeHGlobal(ptrURL);return 200;}}/// <summary>/// 在设备上创建用户信息/// </summary>/// <param name="info"></param>private void SendUserInfo(base_user_extend info){syncStatus = -1;CUserInfoCfg JsonUserInfo = new CUserInfoCfg();JsonUserInfo.UserInfo = new CUserInfo();JsonUserInfo.UserInfo.employeeNo = info.UserCode;JsonUserInfo.UserInfo.name = info.UserName;JsonUserInfo.UserInfo.userType = "normal";JsonUserInfo.UserInfo.Valid = new CValid();JsonUserInfo.UserInfo.Valid.enable = true;JsonUserInfo.UserInfo.Valid.beginTime = "2017-08-01T17:30:08";JsonUserInfo.UserInfo.Valid.endTime = "2037-12-31T23:59:59";JsonUserInfo.UserInfo.Valid.timeType = "local";JsonUserInfo.UserInfo.RightPlan = new List<CRightPlan>();JsonUserInfo.UserInfo.doorRight = "1"; //一定要设置,不设置人脸设置会提示没权限CRightPlan JsonRightPlan = new CRightPlan();JsonRightPlan.doorNo = 1;JsonRightPlan.planTemplateNo = "1";JsonUserInfo.UserInfo.RightPlan.Add(JsonRightPlan);// JsonUserInfo.UserInfo.userVerifyMode = "face";string strJsonUserInfo = JsonConvert.SerializeObject(JsonUserInfo, Formatting.Indented,new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });byte[] byJsonUserInfo = System.Text.Encoding.UTF8.GetBytes(strJsonUserInfo);IntPtr ptrJsonUserInfo = Marshal.StringToHGlobalAnsi(strJsonUserInfo);Marshal.Copy(byJsonUserInfo, 0, ptrJsonUserInfo, byJsonUserInfo.Length);IntPtr ptrJsonData = Marshal.AllocHGlobal(1024);for (int i = 0; i < 1024; i++){Marshal.WriteByte(ptrJsonData, i, 0);}int dwState = (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS;uint dwReturned = 0;while (true){dwState = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(m_lSetUserCfgHandle, ptrJsonUserInfo, (uint)byJsonUserInfo.Length, ptrJsonData, 1024, ref dwReturned);string strJsonData = Marshal.PtrToStringAnsi(ptrJsonData);if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_NEEDWAIT){Thread.Sleep(10);continue;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FAILED){Logger.Error("Set User Fail error:" + CHCNetSDK.NET_DVR_GetLastError());break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS){//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文CResponseStatus JsonResponseStatus = new CResponseStatus();JsonResponseStatus = JsonConvert.DeserializeObject<CResponseStatus>(strJsonData);if (JsonResponseStatus.statusCode == 1){syncStatus = 200;Logger.Log("Set User Success");}else{Logger.Error("Set User Fail, ResponseStatus.statusCode" + JsonResponseStatus.statusCode);}break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FINISH){//下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭Logger.Log("Set User Finish");break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_EXCEPTION){Logger.Error("Set User Exception error:" + CHCNetSDK.NET_DVR_GetLastError());break;}else{Logger.Error("unknown Status error:" + CHCNetSDK.NET_DVR_GetLastError());break;}}if (m_lSetUserCfgHandle != -1){if (CHCNetSDK.NET_DVR_StopRemoteConfig(m_lSetUserCfgHandle)){m_lSetUserCfgHandle = -1;}}Marshal.FreeHGlobal(ptrJsonUserInfo);Marshal.FreeHGlobal(ptrJsonData);}#endregion
  2. 给创建的用户创建卡片
     #region  创建卡片private int CreateCardInfo(base_user_extend info){if (m_lSetCardCfgHandle != -1){if (CHCNetSDK.NET_DVR_StopRemoteConfig(m_lSetCardCfgHandle)){m_lSetCardCfgHandle = -1;}}string sURL = "PUT /ISAPI/AccessControl/CardInfo/SetUp?format=json";IntPtr ptrURL = Marshal.StringToHGlobalAnsi(sURL);m_lSetCardCfgHandle = CHCNetSDK.NET_DVR_StartRemoteConfig(m_UserID, CHCNetSDK.NET_DVR_JSON_CONFIG, ptrURL, sURL.Length, null, IntPtr.Zero);if (m_lSetCardCfgHandle < 0){MessageBox.Show("NET_DVR_StartRemoteConfig fail [url:PUT /ISAPI/AccessControl/CardInfo/SetUp?format=json] error:" + CHCNetSDK.NET_DVR_GetLastError());Marshal.FreeHGlobal(ptrURL);syncStatus = -2;return -1;}else{SendCardData(info);Marshal.FreeHGlobal(ptrURL);return 200;}}/// <summary>/// 创建用户卡号/// </summary>/// <param name="info"></param>private void SendCardData(base_user_extend info){syncStatus = -2;CCardInfoCfg JsonCardInfo = new CCardInfoCfg();JsonCardInfo.CardInfo = new CCardInfo();JsonCardInfo.CardInfo.employeeNo = info.UserCode;JsonCardInfo.CardInfo.cardNo = info.user_key;JsonCardInfo.CardInfo.cardType = "normalCard";string strJsonCardInfo = JsonConvert.SerializeObject(JsonCardInfo, Formatting.Indented,new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });IntPtr ptrJsonCardInfo = Marshal.StringToHGlobalAnsi(strJsonCardInfo);IntPtr ptrJsonData = Marshal.AllocHGlobal(1024);for (int i = 0; i < 1024; i++){Marshal.WriteByte(ptrJsonData, i, 0);}int dwState = 0;uint dwReturned = 0;while (true){dwState = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(m_lSetCardCfgHandle, ptrJsonCardInfo, (uint)strJsonCardInfo.Length, ptrJsonData, 1024, ref dwReturned);string strJsonData = Marshal.PtrToStringAnsi(ptrJsonData);if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_NEEDWAIT){Thread.Sleep(10);continue;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FAILED){Logger.Error("Set Card Fail error:" + CHCNetSDK.NET_DVR_GetLastError());break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS){CResponseStatus JsonResponseStatus = new CResponseStatus();JsonResponseStatus = JsonConvert.DeserializeObject<CResponseStatus>(strJsonData);if (JsonResponseStatus.statusCode == 1){Logger.Log("Set Card Success");syncStatus = 200;}else{Logger.Error("Set Card Fail, ResponseStatus.statusCode:" + JsonResponseStatus.statusCode);}break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_EXCEPTION){Logger.Error("Set Card Exception error:" + CHCNetSDK.NET_DVR_GetLastError());break;}else{Logger.Error("unknown Status error:" + CHCNetSDK.NET_DVR_GetLastError());break;}}if (m_lSetCardCfgHandle != -1){if (CHCNetSDK.NET_DVR_StopRemoteConfig(m_lSetCardCfgHandle)){m_lSetCardCfgHandle = -1;}}Marshal.FreeHGlobal(ptrJsonCardInfo);Marshal.FreeHGlobal(ptrJsonData);}#endregion
  3. 给创建的用户添加人脸信息
     #region 下发人脸信息到设备private void SendFaceData(base_user_extend info){syncStatus = -3;string filename = Base64StringToImage(info.hk_face_info);string sURL = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json";IntPtr ptrURL = Marshal.StringToHGlobalAnsi(sURL);m_lSetFaceCfgHandle = CHCNetSDK.NET_DVR_StartRemoteConfig(m_UserID, CHCNetSDK.NET_DVR_FACE_DATA_RECORD, ptrURL, sURL.Length, null, IntPtr.Zero);if (m_lSetFaceCfgHandle == -1){Marshal.FreeHGlobal(ptrURL);Logger.Error("NET_DVR_StartRemoteConfig fail [url:PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json] error:" + CHCNetSDK.NET_DVR_GetLastError());return;}Marshal.FreeHGlobal(ptrURL);CSetFaceDataCond JsonSetFaceDataCond = new CSetFaceDataCond();JsonSetFaceDataCond.faceLibType = "blackFD";JsonSetFaceDataCond.FDID = "1";JsonSetFaceDataCond.FPID = info.UserCode;string strJsonSearchFaceDataCond = JsonConvert.SerializeObject(JsonSetFaceDataCond, Formatting.Indented,new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });IntPtr ptrJsonSearchFaceDataCond = Marshal.StringToHGlobalAnsi(strJsonSearchFaceDataCond);CHCNetSDK.NET_DVR_JSON_DATA_CFG struJsonDataCfg = new CHCNetSDK.NET_DVR_JSON_DATA_CFG();struJsonDataCfg.dwSize = (uint)Marshal.SizeOf(struJsonDataCfg);struJsonDataCfg.lpJsonData = ptrJsonSearchFaceDataCond;struJsonDataCfg.dwJsonDataSize = (uint)strJsonSearchFaceDataCond.Length;if (!File.Exists(filename)){Logger.Error("The picture does not exist!");Marshal.FreeHGlobal(ptrJsonSearchFaceDataCond);return;}FileStream fs = new FileStream(filename, FileMode.OpenOrCreate);if (0 == fs.Length){Logger.Error("The picture is 0k,please input another picture!");Marshal.FreeHGlobal(ptrJsonSearchFaceDataCond);fs.Close();return;}if (200 * 1024 < fs.Length){Logger.Error("The picture is larger than 200k,please input another picture!");Marshal.FreeHGlobal(ptrJsonSearchFaceDataCond);fs.Close();return;}struJsonDataCfg.dwPicDataSize = (uint)fs.Length;int iLen = (int)struJsonDataCfg.dwPicDataSize;byte[] by = new byte[iLen];struJsonDataCfg.lpPicData = Marshal.AllocHGlobal(iLen);fs.Read(by, 0, iLen);Marshal.Copy(by, 0, struJsonDataCfg.lpPicData, iLen);fs.Close();IntPtr ptrJsonDataCfg = Marshal.AllocHGlobal((int)struJsonDataCfg.dwSize);Marshal.StructureToPtr(struJsonDataCfg, ptrJsonDataCfg, false);IntPtr ptrJsonResponseStatus = Marshal.AllocHGlobal(1024);for (int i = 0; i < 1024; i++){Marshal.WriteByte(ptrJsonResponseStatus, i, 0);}int dwState = (int)CHCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS;uint dwReturned = 0;while (true){dwState = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(m_lSetFaceCfgHandle, ptrJsonDataCfg, struJsonDataCfg.dwSize, ptrJsonResponseStatus, 1024, ref dwReturned);string strResponseStatus = Marshal.PtrToStringAnsi(ptrJsonResponseStatus);if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_NEEDWAIT){Thread.Sleep(10);continue;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FAILED){Logger.Error("Set Face Error:" + CHCNetSDK.NET_DVR_GetLastError());break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS){CResponseStatus JsonResponseStatus = new CResponseStatus();JsonResponseStatus = JsonConvert.DeserializeObject<CResponseStatus>(strResponseStatus);if (JsonResponseStatus.statusCode == 1){syncStatus = 200;Logger.Log("Set Face Success");}else{Logger.Error("Set Face Fail, ResponseStatus.statusCode = " + JsonResponseStatus.statusCode);}break;}else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_EXCEPTION){Logger.Error("Set Face Exception Error:" + CHCNetSDK.NET_DVR_GetLastError());break;}else{Logger.Error("unknown Status Error:" + CHCNetSDK.NET_DVR_GetLastError());break;}}if (m_lSetFaceCfgHandle > 0){CHCNetSDK.NET_DVR_StopRemoteConfig(m_lSetFaceCfgHandle);m_lSetFaceCfgHandle = -1;}Marshal.FreeHGlobal(ptrJsonDataCfg);Marshal.FreeHGlobal(ptrJsonResponseStatus);}#endregion

    继续下一篇

C#海康威视人脸设备-创建人脸信息,并同步到数据库相关推荐

  1. C#海康威视人脸设备-创建人脸信息,并同步到数据库2

    接上一篇 5.设备→云端 通过员工号读取设备是否存在员工信息,若存在则取设备的人脸图片信息,并转成base64图片保存在数据库 //设备→云端private void btnmom_Click(obj ...

  2. (五)为边缘AI人脸识别创建人脸数据库

    目录 介绍 数据库中有什么 创建数据库 填充数据库 下一步 在这里,我们将解释用于人脸识别的简单人脸数据库的结构,开发用于将人脸添加到人脸数据库的实用程序的Python代码,并提供下载人脸以创建数据库 ...

  3. hwd分别是长宽高_DS-2CD7A87HWD-XZS 海康威视800万AI人脸抓拍比对筒型网络摄像机

    DS-2CD7A87HWD-XZS 海康威视800万AI筒型网络摄像机 支持人脸抓拍 人脸前端比对 车辆抓拍 车牌识别 支持H.265编码 内置电动变焦2.8-12mm或者8-32mm镜头 DS-2C ...

  4. 人工智能个性化和逼真的漫画素描生成输入人脸图像创建漫画照片

    人工智能个性化和逼真的漫画素描生成输入人脸图像创建漫画照片摘要 - 在本文中,我们提出了第一个交互式个性化和真实感面部漫画的素描系统.输入人脸图像,用户可以通过操纵其面部特征曲线来创建漫画照片.我们的 ...

  5. Python-OpenCV创建人脸识别器

    1.打开摄像头进行人脸识别 #导入相关库 import numpy as np import cv2 #要加载人脸检测相关的pre-trained分类器,级联检测器 detector = cv2.Ca ...

  6. 广东首例!涉“人脸识别”公民个人信息保护民事公益诉讼案宣判

    认证数据保护官CDPO培训课程第3期 报名通道 时间:2022年7月30日.31日(周六.周日) 形式:线上培训及线上考试 联系:微信(徐博士):heguilvshi,手机(朱老师):138 1664 ...

  7. K210人脸识别+RFID录入信息

    K210系列教程 使用MaixPy IDE开发K210 K210实现人脸识别(附代码解读) K210人脸识别+人脸信息存储 K210人脸识别+RFID录入信息 (置顶:有位码友看了这篇博客后尝试了RF ...

  8. matlab人脸识别样本库建立,facenet 人脸识别(二)——创建人脸库搭建人脸识别系统...

    搭建人脸库 选择的方式是从百度下载明星照片 照片下载,downloadImageByBaidu.py # coding=utf-8 """ 爬取百度图片的高清原图 &qu ...

  9. 大华sdk(java)上传人脸图片到人脸库,订阅人脸识别对比

    上传人脸图片到人脸库 controller: @RestController @RequestMapping("/facePicture") public class FacePi ...

最新文章

  1. GEO,以GSM2309041这套数据为例,找到需要的sra数据,SRX2159543
  2. 浅谈Laravel中的设计模式(四) Contract 契约模式
  3. 从博客时间轴总结这一年
  4. jQuery中hover与mouseover和mouseout的区别分析
  5. 使用C/C++解析json文件
  6. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记
  7. web.xml中servlet配置及其含义
  8. Java回调函数实例
  9. 开关电源和家电电源常用电磁兼容(EMC)执行标准
  10. 《锋利的jQuery》笔记 第2章 jQuery选择器
  11. 手把手搭建K3cloud插件开发环境
  12. Echarts绘制中国地图
  13. 程 | 深度学习 + OpenCV,Python 实现实时视频目标检测 机器之心 09-21
  14. python没有缩进错误但报缩进_Python:“缩进错误:unindent与任何外部缩进级别都不匹配”...
  15. 如何修复Windows 10中最烦人的东西
  16. java升序排列数组_java数组的升序降序排列
  17. 问题 B: Little Sub and Triples
  18. 给北上奋进的你一份礼物(java面试知识储备攻略)
  19. 《Flutter入门疑难杂症》imagepicker ImagePicker().getVideo()返回.jpg
  20. php数组和链表的区别,什么是链表?链表与数组的区别?

热门文章

  1. android 中文开发文档
  2. MinGW64的使用
  3. 计挑赛初赛试题(2021)(Java组)
  4. Super4PCS文章阅读笔记
  5. 任杰中山大学计算机技术,喜讯 | 港中大(深圳)学子在2020年“外研社·国才杯”全国英语大赛(广东复赛)创造佳绩...
  6. 2022年4月线上终端药品增长迅猛,市场政策合规进程加快
  7. 【软件体系结构】考点总结 第三章 软件体系结构风格 XJU
  8. 教你一个用计算机表白的方法,七夕示爱教你用文件夹加密方式锁定表白
  9. openlayers3.20.1发布说明
  10. 计算机组装有哪些,电脑组装的配件有哪些