大华相机接入web页面实现人脸识别

先看下效果,中间主视频流就是大华相机(视频编码H.264),海康相机(视屏编码H.265)

在这里插入图片描述

在这里插入图片描述
前端接入视屏流代码

  <!--视频流-->
            <div id="col2">
                <div class="cell" style="flex: 7; background: none">
                    <div class="cell-box" style="position: relative">
                        <video autoplay muted id="video" class="video" />

                        <div class="cell div-faces">
                            <div class="cell-box">
                                <!--人脸识别-->
                                <div class="faces-wrapper">
                                    <div v-for="i in 5" :key="i" class="face-wrapper">
                                        <div class="face-arrow"></div>
                                        <div
                                            class="face-image"
                                            :style="{
                                                background: faceImages[i - 1]
                                                    ? `url(data:image/jpeg;base64,${
                                                          faceImages[i - 1]
                                                      }) 0 0 / 100% 100% no-repeat`
                                                    : ''
                                            }"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
api.post('screen2/init').then((attach) => {
        const { streamerIp, streamerPort, cameraIp, cameraPort, cameraAdmin, cameraPsw } = attach
        webRtcServer = new WebRtcStreamer('video', `${location.protocol}//${streamerIp}:${streamerPort}`)
        webRtcServer.connect(`rtsp://${cameraAdmin}:${cameraPsw}@${cameraIp}:${cameraPort}`)
    })

后台部署需要启动:webrtc-streamer.exe 用来解码视屏流,这样就能实现web页面接入视屏流。

主视屏流下面的相机抓拍图片和预警数据接口是怎么实现的呢?
1、需要把大华相机的sdk加载到项目中sdk下载
在这里插入图片描述
在maven的pom.xml中添加依赖,将上面jar包 依赖到项目中

        <!--外部依赖-->
        <dependency>
            <!--groupId和artifactId不知道随便写-->
            <groupId>com.dahua.netsdk</groupId>
            <artifactId>netsdk-api-main</artifactId>
            <!--依赖范围,必须system-->
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <!--依赖所在位置-->
            <systemPath>${project.basedir}/libs/netsdk-api-main-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <!--groupId和artifactId不知道随便写-->
            <groupId>com.dahua.netsdk</groupId>
            <artifactId>netsdk-dynamic</artifactId>
            <!--依赖范围,必须system-->
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <!--依赖所在位置-->
            <systemPath>${project.basedir}/libs/netsdk-dynamic-lib-main-1.0.jar</systemPath>
        </dependency>
        <dependency>
            <!--groupId和artifactId不知道随便写-->
            <groupId>com.dahua.netsdk</groupId>
            <artifactId>netsdk-jna</artifactId>
            <!--依赖范围,必须system-->
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <!--依赖所在位置-->
            <systemPath>${project.basedir}/libs/jna.jar</systemPath>
        </dependency>

然后写一个大华初始化,登录,订阅类 InitDahua

package ahpu.aip.controller.dahua;

import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class InitDahua implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        //NetSDK 库初始化
          boolean bInit    = false;
         NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE;
        // 智能订阅句柄
          NetSDKLib.LLong attachHandle = new NetSDKLib.LLong(0);


        //设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
          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会调用该函数
          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);
            }
        }


        //登陆参数
          String m_strIp         = "192.168.1.108";
          int m_nPort        	   = 37777;
          String m_strUser       = "admin";
          String m_strPassword   = "admin123456";
        //设备信息
          NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); // 对应CLIENT_LoginEx2
          NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);     // 登陆句柄
          NetSDKLib.LLong m_hAttachHandle = new NetSDKLib.LLong(0);    // 智能订阅句柄

//        初始化
        bInit = netsdkApi.CLIENT_Init(new DisConnect(), null);
        if(!bInit) {
            System.out.println("Initialize SDK failed");
        }else{
            System.out.println("Initialize SDK Success");
        }

        // 登录
        int nSpecCap = NetSDKLib.EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP; //=0
        IntByReference nError = new IntByReference(0);
        m_hLoginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, nSpecCap, null, m_stDeviceInfo, nError);
        if(m_hLoginHandle.longValue() == 0) {
            System.err.printf("Login Device[%s] Port[%d]Failed.\n", m_strIp, m_nPort, ToolKits.getErrorCode());
        } else {
            System.out.println("Login Success [ " + m_strIp + " ]");
        }


        // 订阅
        int bNeedPicture = 1; // 是否需要图片
        m_hAttachHandle =  netsdkApi.CLIENT_RealLoadPictureEx(m_hLoginHandle, 0, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, new AnalyzerDataCB(), null, null);
        if(m_hAttachHandle.longValue() == 0) {
            System.err.println("CLIENT_RealLoadPictureEx Failed, Error:" + ToolKits.getErrorCode());
        }else {
            System.out.println("订阅成功~");
        }

    }


}

回调类,具体识别结果在回调中获取

package ahpu.aip.controller.dahua;

import ahpu.aip.AiPlatformServerApplication;
import ahpu.aip.util.RedisUtils;
import ahpu.aip.util.StringUtils;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Pointer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

@Component
public class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
    private static final Logger log = LoggerFactory.getLogger(AnalyzerDataCB.class);

    public static HashMap<String, Object> temMap;

    private int bGlobalScenePic;					//全景图是否存在, 类型为BOOL, 取值为0或者1
    private NetSDKLib.NET_PIC_INFO stuGlobalScenePicInfo;     //全景图片信息


    private NetSDKLib.NET_PIC_INFO stPicInfo;	  			    // 人脸图
    private NetSDKLib.NET_FACE_DATA stuFaceData;			    // 人脸数据

    private int nCandidateNumEx;				    // 当前人脸匹配到的候选对象数量
    private NetSDKLib.CANDIDATE_INFOEX[] stuCandidatesEx;     // 当前人脸匹配到的候选对象信息扩展

    // 全景大图、人脸图、对比图
    private BufferedImage globalBufferedImage = null;
    private BufferedImage personBufferedImage = null;
    private BufferedImage candidateBufferedImage = null;
    String[] faceSexStr = {"未知", "男", "女"};
    // 用于保存对比图的图片缓存,用于多张图片显示
    private ArrayList<BufferedImage> arrayListBuffer = new ArrayList<BufferedImage>();

    @Override
    public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType,
                      Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
                      Pointer dwUser, int nSequence, Pointer reserved) {

        // 获取相关事件信息
        getObjectInfo(dwAlarmType, pAlarmInfo);

        /*if(dwAlarmType == NetSDKLib.EVENT_IVS_FACERECOGNITION) {   // 目标识别
            // 保存图片
            savePicture(pBuffer, dwBufSize, bGlobalScenePic, stuGlobalScenePicInfo, stPicInfo, nCandidateNumEx, stuCandidatesEx);

            // 刷新UI时,将目标识别事件抛出处理
            EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
            if (eventQueue != null) {
                eventQueue.postEvent(new FaceRecognitionEvent(this,
                        globalBufferedImage,
                        personBufferedImage,
                        stuFaceData,
                        arrayListBuffer,
                        nCandidateNumEx,
                        stuCandidatesEx));
            }
        } else*/ if(dwAlarmType == NetSDKLib.EVENT_IVS_FACEDETECT) {  // 人脸检测
            // 保存图片
            savePicture(pBuffer, dwBufSize, stPicInfo);
        }

        return 0;
    }

    /**
     * 获取相关事件信息
     * @param dwAlarmType 事件类型
     * @param pAlarmInfo 事件信息指针
     */
    public void getObjectInfo(int dwAlarmType, Pointer pAlarmInfo) {
        if(pAlarmInfo == null) {
            return;
        }

        switch(dwAlarmType)
        {
            case NetSDKLib.EVENT_IVS_FACERECOGNITION:  ///< 目标识别事件
            {
                NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO msg = new NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO();
                ToolKits.GetPointerData(pAlarmInfo, msg);

                bGlobalScenePic = msg.bGlobalScenePic;
                stuGlobalScenePicInfo = msg.stuGlobalScenePicInfo;
                stuFaceData = msg.stuFaceData;
                stPicInfo = msg.stuObject.stPicInfo;
                nCandidateNumEx = msg.nRetCandidatesExNum;
                stuCandidatesEx = msg.stuCandidatesEx;

                break;
            }
            case NetSDKLib.EVENT_IVS_FACEDETECT:   ///< 人脸检测
            {
                NetSDKLib.DEV_EVENT_FACEDETECT_INFO msg = new NetSDKLib.DEV_EVENT_FACEDETECT_INFO();
                ToolKits.GetPointerData(pAlarmInfo, msg);

                stPicInfo = msg.stuObject.stPicInfo;  // 检测到的人脸

//                System.out.println("sex:" + faceSexStr[msg.emSex]);
                log.info("口罩状态(0-未知,1-未识别,2-没戴口罩,3-戴口罩了):" + msg.emMask);
                log.info("时间:"+msg.UTC);
                RedisUtils.set("mask",msg.emMask==3?"戴口罩":"未戴口罩");
                RedisUtils.set("time",msg.UTC+"");

                break;
            }
            default:
                break;
        }
    }

    /**
     * 保存目标识别事件图片
     * @param pBuffer 抓拍图片信息
     * @param dwBufSize 抓拍图片大小
     */
   /* public void savePicture(Pointer pBuffer, int dwBufSize,
                            int bGlobalScenePic, NetSDKLib.NET_PIC_INFO stuGlobalScenePicInfo,
                            NetSDKLib.NET_PIC_INFO stPicInfo,
                            int nCandidateNum, NetSDKLib.CANDIDATE_INFOEX[] stuCandidatesEx) {
        File path = new File("./FaceRegonition/");
        if (!path.exists()) {
            path.mkdir();
        }

        if (pBuffer == null || dwBufSize <= 0) {
            return;
        }

        /// 保存全景图 ///
        if(bGlobalScenePic == 1 && stuGlobalScenePicInfo != null) {
            String strGlobalPicPathName = path + "\\" + System.currentTimeMillis() + "Global.jpg";
            byte[] bufferGlobal = pBuffer.getByteArray(stuGlobalScenePicInfo.dwOffSet, stuGlobalScenePicInfo.dwFileLenth);
            ByteArrayInputStream byteArrInputGlobal = new ByteArrayInputStream(bufferGlobal);

            try {
                globalBufferedImage = ImageIO.read(byteArrInputGlobal);
                if(globalBufferedImage == null) {
                    return;
                }
                ImageIO.write(globalBufferedImage, "jpg", new File(strGlobalPicPathName));
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }

        /// 保存人脸图 /
        if(stPicInfo != null) {
            String strPersonPicPathName = path + "\\" + System.currentTimeMillis() + "Person.jpg";
            byte[] bufferPerson = pBuffer.getByteArray(stPicInfo.dwOffSet, stPicInfo.dwFileLenth);
            ByteArrayInputStream byteArrInputPerson = new ByteArrayInputStream(bufferPerson);

            try {
                personBufferedImage = ImageIO.read(byteArrInputPerson);
                if(personBufferedImage == null) {
                    return;
                }
                ImageIO.write(personBufferedImage, "jpg", new File(strPersonPicPathName));
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }

        / 保存对比图 //
        arrayListBuffer.clear();
        if(nCandidateNum > 0 && stuCandidatesEx != null) {
            for(int i = 0; i < nCandidateNum; i++) {
                String strCandidatePicPathName = path + "\\" + System.currentTimeMillis() + "Candidate.jpg";
                // 多张对比图
                for(int j = 0; j < stuCandidatesEx[i].stPersonInfo.wFacePicNum; j++) {
                    byte[] bufferCandidate = pBuffer.getByteArray(stuCandidatesEx[i].stPersonInfo.szFacePicInfo[j].dwOffSet, stuCandidatesEx[i].stPersonInfo.szFacePicInfo[j].dwFileLenth);
                    ByteArrayInputStream byteArrInputCandidate = new ByteArrayInputStream(bufferCandidate);

                    try {
                        candidateBufferedImage = ImageIO.read(byteArrInputCandidate);
                        if(candidateBufferedImage == null) {
                            return;
                        }
                        ImageIO.write(candidateBufferedImage, "jpg", new File(strCandidatePicPathName));
                    } catch (IOException e2) {
                        e2.printStackTrace();
                    }
                    arrayListBuffer.add(candidateBufferedImage);
                }
            }
        }
    }*/

    /**
     * 保存人脸检测事件图片 ===
     * @param pBuffer 抓拍图片信息
     * @param dwBufSize 抓拍图片大小
     */
    public void savePicture(Pointer pBuffer, int dwBufSize, NetSDKLib.NET_PIC_INFO stPicInfo) {
        File path = new File("./FaceDetected/");
        if (!path.exists()) {
            path.mkdir();
        }

        if (pBuffer == null || dwBufSize <= 0) {
            return;
        }

        /// 保存全景图 ///
      /*  String strGlobalPicPathName = path + "\\" + System.currentTimeMillis() + "Global.jpg";
        byte[] bufferGlobal = pBuffer.getByteArray(0, dwBufSize);
        ByteArrayInputStream byteArrInputGlobal = new ByteArrayInputStream(bufferGlobal);

        try {
            globalBufferedImage = ImageIO.read(byteArrInputGlobal);
            if(globalBufferedImage == null) {
                return;
            }
            ImageIO.write(globalBufferedImage, "jpg", new File(strGlobalPicPathName));

        } catch (IOException e2) {
            e2.printStackTrace();
        }*/

        /// 保存人脸图 /
        if(stPicInfo != null) {
            String strPersonPicPathName = path + "\\" + System.currentTimeMillis() + "Person.jpg";
            byte[] bufferPerson = pBuffer.getByteArray(stPicInfo.dwOffSet, stPicInfo.dwFileLenth);
            ByteArrayInputStream byteArrInputPerson = new ByteArrayInputStream(bufferPerson);

            try {
                personBufferedImage = ImageIO.read(byteArrInputPerson);
                if(personBufferedImage == null) {
                    return;
                }
                ImageIO.write(personBufferedImage, "jpg", new File(strPersonPicPathName));

                //  把图片保存到resultMap中
                String base64 = Base64.encode(new File(strPersonPicPathName));
                log.info("base64图片:data:image/jpeg;base64,"+base64);

                RedisUtils.set("img","data:image/jpeg;base64,"+base64);

                String listStr = (String) RedisUtils.get("dahuaList");

                List<HashMap> list = JSONArray.parseArray(listStr,HashMap.class);
                HashMap<String,String> tmpResult = new HashMap<String,String>();
                tmpResult.put("img",(String) RedisUtils.get("img"));
                tmpResult.put("time",(String) RedisUtils.get("time"));
                tmpResult.put("mask",(String) RedisUtils.get("mask"));

                if(CollectionUtils.isEmpty(list)){
                    list = new ArrayList<>();
                    list.add(tmpResult);
                }else {
                    list.add(tmpResult);
                }

                if(list.size()>5){
                    RedisUtils.set("dahuaList",JSON.toJSONString(list.subList(list.size()-5,list.size())));
                }else {
                    RedisUtils.set("dahuaList",JSON.toJSONString(list));
                }


            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    }


}

人脸识别事件类

package ahpu.aip.controller.dahua;

import com.netsdk.lib.NetSDKLib;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import org.springframework.stereotype.Component;

public class FaceRecognitionEvent extends AWTEvent {
    private static final long serialVersionUID = 1L;
    public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 1;

    private BufferedImage globalImage = null;
    private BufferedImage personImage = null;
    private NetSDKLib.NET_FACE_DATA stuFaceData;
    private ArrayList<BufferedImage> arrayList = null;
    private int nCandidateNum;
    private ArrayList<String[]> candidateList;

    // 用于保存对比图的人脸库id、名称、人员名称、相似度
    private static String[] candidateStr = new String[4];
    private static final String encode = "UTF-8";

    public FaceRecognitionEvent(Object target,
                                BufferedImage globalImage,
                                BufferedImage personImage,
                                NetSDKLib.NET_FACE_DATA stuFaceData,
                                ArrayList<BufferedImage> arrayList,
                                int nCandidateNum,
                                NetSDKLib.CANDIDATE_INFOEX[] stuCandidatesEx) {
        super(target,EVENT_ID);
        this.globalImage = globalImage;
        this.personImage = personImage;
        this.stuFaceData = stuFaceData;
        this.arrayList = arrayList;
        this.nCandidateNum = nCandidateNum;
        this.candidateList = new ArrayList<String[]>();

        this.candidateList.clear();
        for(int i = 0; i < nCandidateNum; i++) {
            try {
                candidateStr[0] = new String(stuCandidatesEx[i].stPersonInfo.szGroupID, encode).trim();
                candidateStr[1] = new String(stuCandidatesEx[i].stPersonInfo.szGroupName, encode).trim();
                candidateStr[2] = new String(stuCandidatesEx[i].stPersonInfo.szPersonName, encode).trim();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            candidateStr[3] = String.valueOf(0xff & stuCandidatesEx[i].bySimilarity);

            this.candidateList.add(candidateStr);
        }
    }
}

获取结果接口类

@RestController
@Validated
@RequestMapping("dahua/")
public class DahuaController {

    @ApiOperation(value = "大华人脸",tags = "大华人脸")
    @GetMapping("getFaceList")
    public R face() {
        String dahuaList = (String) RedisUtils.get("dahuaList");
        List<HashMap> list = JSONArray.parseArray(dahuaList,HashMap.class);
        return R.succ().attach(list);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/40086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[GXYCTF2019]simple CPP

前言 三个加密区域&#xff0c;第一次是基本运算&#xff0c;八位叠加&#xff0c;z3方程 分析 第一轮加密&#xff0c;和Dst中模27异或 &#xff08;出题人对动调有很大意见呢&#xff09; 将输入的字符串按八位存入寄存器中&#xff0c;然后将寄存器内容转存到内存 第一次…

数仓-零基础小白到入土-学习路线

数仓-零基础小白到入土-学习路线 铺垫一下下讲在前面涉及基础技术栈&#xff1a;中级&#xff1a;全部掌握之后&#x1f446;&#xff1a;去刷面试题&#xff1a; 初级中级高级博主独家面试题&#xff1a;数仓名词&#xff1a;催更我戳戳个人主页&#xff1a;[up自己的网站](ht…

【电路原理学习笔记】第4章:能量与功率:4.5 稳压电源与电池

第4章&#xff1a;能量与功率 4.5 稳压电源与电池 电网采用交流电形式将电能从发电站传输给用户&#xff0c;这是因为交流电易于转换成适宜传输的高压和终端用户使用的低压。在远距离传输时&#xff0c;采用高电压传输的效率和效益要高得多。对于给定的功率&#xff0c;较高的…

基于linux下的高并发服务器开发(第一章)- 目录操作函数

09 / 目录操作函数 &#xff08;1&#xff09;int mkdir(const char* pathname,mode_t mode); #include <sys/stat.h> #include <sys/types.h>int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; pat…

【OC总结- Block】

文章目录 前言2. Block2.1 Block的使用规范2.2 __block修饰符2.3 Block的类型2.4 Block的循环引用及解决循环引用的场景引入解决循环引用Block循环引用场景 2.5 Block的实现及其本质2.5.1 初始化部分2.5.2 调用部分2.5.3 捕获变量 Block本质2.6 Block捕获变量 和 对象2.7 Block…

基于 ChatGPT 的 helm 入门

1. 写在最前面 公司最近在推业务上云&#xff08;底层为 k8s 管理&#xff09;&#xff0c;平台侧为了简化业务侧部署的复杂度&#xff0c;基于 helm 、chart 等提供了一个发布平台。 发布平台的使用使业务侧在不了解 helm 、chart 等工具的时候&#xff0c;「只要点点」就可…

LCD—STM32液晶显示(1.显示器简介及LCD显示原理)(6000字详细介绍)

目录 显示器简介 液晶显示器 液晶 像素 液晶屏缺点 LED显示器 OLED显示器 显示器的基本参数 STM32板载液晶控制原理&#xff08;不带微控制器&#xff09; 液晶控制原理 控制信号线(不带液晶控制器) 液晶数据传输时序 显存 总结 3.2寸液晶屏介绍&#xff08;搭载…

IIS Express本地开发测试如何映射到外网访问?

1.IIS Express是什么 IIS Express是为开发人员优化的轻量级、自包含版本的IIS。它具有IIS 7及以上的所有核心功能&#xff0c;以及为简化网站开发而设计的附加功能。 IIS Express&#xff08;跟ASP.NET开发服务器一样&#xff09;可以快速地从硬盘上的某个文件夹上启动网站…

SylixOS下SSH和SFTP连接

简要 基于网络的连接&#xff08;telnet&#xff0c;ftp&#xff09;方便高效&#xff0c;但其是基于明文的通信&#xff0c;容易被窃取、篡改和攻击&#xff0c;存在网络安全问题&#xff0c;尤其在进行远程访问时&#xff0c;穿过复杂未知的公网环境非常危险&#xff0c;为此…

中信银行西安分行举办金融助力外贸企业“走出去“高端论坛

7月14日&#xff0c;中信银行西安分行联合中国出口信用保险公司陕西分公司、西安市工商联举办"智汇西安、信融全球"——金融助力外贸企业"走出去"高端论坛。该论坛紧跟“加快建设贸易强国”的战略指引&#xff0c;以创新金融服务助力外贸企业融入高水平对外…

C++-----vector

本期我们来学习C中的vector&#xff0c;因为有string的基础&#xff0c;所以我们会讲解的快一点 目录 vector介绍 vector常用接口 构造函数 sort 迭代器 size&#xff0c;max_size&#xff0c;capacity&#xff0c;empty reserve和resize front和back data insert和…

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…

pycharm里debug时torch数组显示不全

pycharm里查看torch数组全部值 一、在Pycharm运行torch数组时&#xff0c;通常只能看到数组的一部分二、解决办法1、debug后&#xff0c;鼠标右键想要查看完整的数组&#xff0c;选择Evaluate Expression2、输入np.array(x0.data)&#xff0c;x0为想要查看的数组名&#xff0c;…

畅游NLP海洋:HuggingFace的快速入门

目录 前言一、HuggingFace介绍1-1、HuggingFace的介绍1-2、安装 二、Tokenizer分词库&#xff1a;分词工具2-0、加载BertTokenizer&#xff1a;需要传入预训练模型的名字2-1、使用Tokenizer对句子编码&#xff1a;2-2、使用增强Tokenizer对句子编码&#xff1a;2-3、批量编码单…

Apache Kudu 在**医疗科技的生产实践

目录 说明 医疗场景下数据特点 KUDU 的介绍 kudu 架构 kudu 文件组织形式 kudu的生产实践 技术选型 整体的架构 项目遇到的问题 参考资料 说明 本文主要介绍APACHE KUDU 在**医疗科技数据实时分析场景下的实践&#xff0c;内容包括&#xff1a; 医疗场景下数据特点 …

LCD—STM32液晶显示(4.液晶控制代码讲解)

目录 STM32液晶控制代码讲解 液晶接口封装介绍 使用LCD的配置步骤 内存操作要使用volatile进行修饰 图形绘制实现 绘制矩形 重点补充 STM32液晶控制代码讲解 液晶接口封装介绍 指南者液晶接口原理图 左边DB00—DB15表示液晶屏的数据线引脚&#xff0c;分别对应STM32的F…

【无线通信模块】什么是PCB板载天线,PCB板载天线UART/USB接口WiFi模块

基于射频技术的无线模块需要通过天线来发射和接收电磁波信号&#xff0c;市场上常见的天线类型有陶瓷天线、板载天线、棒状天线以及外接天线&#xff0c;外接天线是通过在PCB板上预留IPEX座子&#xff0c;可选天线类型就比较多。本篇SKYLAB小编带大家了解一下板载天线的UART接口…

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时&#xff0c;可以在安装更少的预装应用程序情况下&#xff0c;获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

MVVM 实现记录文本

1. MVVM 框架说明: Model - 数据层 View - 视图层 ViewModel - 管理模型的视图 2. 资源文件 2.1 启动图标: AppIconhttps://img-blog.csdnimg.cn/8fa1031489f544ef9757b6b3ab0eddbe.png 2.2 Display Name: Do Stuff 2.2 颜色图: 2.3 项目结构图: 3. Model 层实现&a…

设计模式——享元模式

享元模式 定义 享元模式&#xff08;Flyweight Pattern&#xff09;是池技术的重要实现方式。 使用共享对象可以有效地支持大量的细粒度对象。 优缺点、应用场景 优点 可以大大减少应用程序创建对象的数量&#xff0c;降低程序内存占用。 缺点 提高了系统的复杂度&…