最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot實(shí)現(xiàn)人臉識別與WebSocket長連接的實(shí)現(xiàn)代碼

 更新時間:2023年11月06日 15:20:17   作者:默默努力的小老弟  
這篇文章主要介紹了Springboot實(shí)現(xiàn)人臉識別與WebSocket長連接的實(shí)現(xiàn),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

0.什么是WebSocket,由于普通的請求是間斷式發(fā)送的,如果要同一時間發(fā)生大量的請求,必然導(dǎo)致響應(yīng)速度慢(因?yàn)楦鶕?jù)tcp協(xié)議要經(jīng)過三層握手,如果不持續(xù)發(fā)送,就會導(dǎo)致n多次握手,關(guān)閉連接,打開連接)

1.業(yè)務(wù)需求: 由于我需要使用java來處理視頻的問題,視頻其實(shí)就是圖片,相當(dāng)于每張圖片就是幀,不停發(fā)送幀去實(shí)現(xiàn)人臉失敗,然后返回處理結(jié)果,(支付寶刷臉支付也是同樣的道理)

2.前端建立WebSocket()對象,onMessage函數(shù)監(jiān)聽返回的結(jié)果

<!DOCTYPE html>
<html>
<head>
    <title>視頻幀捕獲</title>
</head>
<body>
    <video id="videoElement" autoplay></video>
    <canvas id="canvasElement" style="display: none;"></canvas>
    <script>
     //如果是https協(xié)議的話,就需要改為 wss
           var socket = new WebSocket("ws://localhost:8080/facedetect");
       const video = document.getElementById('videoElement');
        const canvas = document.getElementById('canvasElement');
        const context = canvas.getContext('2d');
    socket.onopen = function() {
          console.log("xxxx");
       // 每1秒發(fā)送一次視頻幀數(shù)據(jù),必須要在這里寫定時器,因?yàn)榇蜷_連接后才能發(fā)送請求,不然每次都會報Websocket close的錯誤
          setInterval(captureFrame,10000)
    };
      socket.onmessage = function(event) {
    	var result = event.data;
  	  // 處理服務(wù)器返回的結(jié)果
   	 console.log(result);//打印出結(jié)果
      };
    socket.onclose = function(event) {
        console.log("WebSocket已關(guān)閉");
    };
    socket.onerror = function(event) {
  console.error('WebSocket錯誤:', event);
 };
        navigator.mediaDevices.getUserMedia({ video: true })
            .then(stream => {
                video.srcObject = stream;
            })
            .catch(error => {
                console.error('無法訪問攝像頭:', error);
            });
        function captureFrame() {
            context.drawImage(video, 0, 0, canvas.width, canvas.height);
             const imageDataUrl = canvas.toDataURL('image/jpeg', 0.5);
             console.log(imageDataUrl) 
            socket.send(imageDataUrl);
          // 將數(shù)據(jù)URL發(fā)送到WebSocket服務(wù)器
        }
        // 每隔一段時間捕獲一幀并發(fā)送到Servlet
    </script>
</body>
</html>

3.后端寫配置類,配置websocket的路徑

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
           //錄入人臉數(shù)據(jù)頁面
        registry.addHandler(myHandler(),  "/face").setAllowedOrigins("*");
         //人臉識別頁面
        registry.addHandler(myHandler1(), "/facedetect").setAllowedOrigins("*");
    }
    @Bean
    public WebSocketHandler myHandler() {
        return new FaceController();
    }
    @Bean
    public WebSocketHandler myHandler1() {
        return new FaceController1();
    }
}

4.寫controller

//人臉錄入的controller
@Controller
@RequestMapping("/face")
@CrossOrigin
public class FaceController extends TextWebSocketHandler {
private WebSocketSession session;
    // 處理WebSocket連接請求
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("WebSocket連接已建立");
        // 保存WebSocket會話
        this.session = session;
    }
    // 處理WebSocket文本消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String text = message.getPayload();
        System.out.println(text);
        text = text.replaceFirst("^data:image/[^;]+;base64,?\\s*", "");
        text = text.replaceAll("[^A-Za-z0-9+/=]", "");
        System.out.println(text);
        byte[] imageBytes = Base64.getDecoder().decode(text);
        if (imageBytes != null) {
            try {
                // 讀取字節(jié)數(shù)組并返回BufferedImage對象
                ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
                BufferedImage bufferedImage = ImageIO.read(bis);
                if (bufferedImage != null) {
                    // 示例:顯示圖像寬度和高度
                    int width = bufferedImage.getWidth();
                    int height = bufferedImage.getHeight();
                    System.out.println("圖像寬度:" + width);
                    System.out.println("圖像高度:" + height);
               //錄入人臉
                    Employee e1 = HRService.addEmp(UUID.randomUUID().toString().substring(0,10), bufferedImage);
                    ImageService.saveFaceImage(bufferedImage, e1.getCode());// 保存員工照片文件
                    System.out.println(e1.getCode());
                    // 在這里可以對BufferedImage對象進(jìn)行其他操作
                } else {
                    System.out.println("無法讀取圖像");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("無效的base64數(shù)據(jù)");
        }
    }
        // 根據(jù)接收到的文本消息進(jìn)行相應(yīng)的處理
}
//人臉檢測的控制器
@Controller
@RequestMapping("/facedetect")
@CrossOrigin
public class FaceController1 extends TextWebSocketHandler {
private WebSocketSession session;
    // 處理WebSocket連接請求
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("WebSocket連接已建立");
        // 保存WebSocket會話
        this.session = session;
    }
    // 處理WebSocket文本消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        System.out.println("detect");
        String text = message.getPayload();
        System.out.println(text);
        text = text.replaceFirst("^data:image/[^;]+;base64,?\\s*", "");
        text = text.replaceAll("[^A-Za-z0-9+/=]", "");
        System.out.println(text);
        byte[] imageBytes = Base64.getDecoder().decode(text);
        if (imageBytes != null) {
            try {
                // 讀取字節(jié)數(shù)組并返回BufferedImage對象
                ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
                BufferedImage bufferedImage = ImageIO.read(bis);
                if (bufferedImage != null) {
                    FaceEngineService.loadAllFaceFeature();
                    FaceFeature faceFeature = FaceEngineService.getFaceFeature(bufferedImage);
                    // 獲取當(dāng)前幀中出現(xiàn)的人臉對應(yīng)的特征碼
                  String code = FaceEngineService.detectFace(faceFeature);
                    System.out.println(code);
                    if (code != null) {// 如果特征碼不為null,表明畫面中存在某員工的人臉
                        Employee e = HRService.getEmp(code);// 根據(jù)特征碼獲取員工對象
                        HRService.addClockInRecord(e);// 為此員工添加打卡記錄
                        // 文本域添加提示信息
                        session.sendMessage(new TextMessage("打卡成功"));
                    }
                    // 在這里可以對BufferedImage對象進(jìn)行其他操作
                } else {
                    session.sendMessage(new TextMessage("打卡成功"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("無效的base64數(shù)據(jù)");
        }
    }
        // 根據(jù)接收到的文本消息進(jìn)行相應(yīng)的處理
}

到此這篇關(guān)于Springboot實(shí)現(xiàn)人臉識別與WebSocket長連接的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Springboot WebSocket長連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Security自定義異常 AccessDeniedHandler不生效解決方法

    Spring Security自定義異常 AccessDeniedHandler不生效解決方法

    本文主要介紹了Spring Security自定義異常 AccessDeniedHandler不生效解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java+opencv3.2.0實(shí)現(xiàn)人臉檢測功能

    Java+opencv3.2.0實(shí)現(xiàn)人臉檢測功能

    這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)人臉檢測功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • ReentrantLock 非公平鎖實(shí)現(xiàn)原理詳解

    ReentrantLock 非公平鎖實(shí)現(xiàn)原理詳解

    這篇文章主要為大家介紹了ReentrantLock 非公平鎖實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法

    Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法

    在Java中生成隨機(jī)數(shù)的場景有很多,下面這篇文章主要給大家介紹了關(guān)于Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼

    SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼

    這篇文章主要給大家介紹了SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • Spring Boot 緩存 Cache 入門詳解

    Spring Boot 緩存 Cache 入門詳解

    本文主要介紹SpringBoot緩存的入門知識,包括緩存的必要性、常見的緩存策略、SpringCache的注解使用、SpringBoot與緩存的集成以及Ehcache和Redis的示例,同時,還提供了緩存面試問題的思路和答案,幫助讀者更好地理解和掌握SpringBoot緩存的相關(guān)內(nèi)容,感興趣的朋友一起看看吧
    2025-03-03
  • JSONObject如何轉(zhuǎn)為實(shí)體類對象

    JSONObject如何轉(zhuǎn)為實(shí)體類對象

    介紹了JSONObject轉(zhuǎn)為實(shí)體類對象的三種方法:JSONObject中的toJavaObject方法和getObject方法支持深轉(zhuǎn)換,而JSON中的parseObject方法只能轉(zhuǎn)換一層對象,此外,還補(bǔ)充說明了在對JSON轉(zhuǎn)為實(shí)體類對象時,無論JSON中的數(shù)據(jù)字段是否多于或少于實(shí)體類中字段,轉(zhuǎn)化都不會報錯
    2024-11-11
  • c語言來實(shí)現(xiàn)貪心算法之裝箱問題

    c語言來實(shí)現(xiàn)貪心算法之裝箱問題

    這篇文章主要介紹了c語言來實(shí)現(xiàn)貪心算法之裝箱問題,需要的朋友可以參考下
    2015-03-03
  • JavaSE的三大接口:Comparator,Comparable和Cloneable詳解

    JavaSE的三大接口:Comparator,Comparable和Cloneable詳解

    這篇文章主要介紹了詳解JavaSE中Comparator,Comparable和Cloneable接口的區(qū)別的相關(guān)資料,希望通過本文大家能徹底掌握這部分內(nèi)容,需要的朋友可以參考下
    2021-10-10
  • Java的Struts框架中配置國際化的資源存儲的要點(diǎn)解析

    Java的Struts框架中配置國際化的資源存儲的要點(diǎn)解析

    這篇文章主要介紹了Java的Struts框架中配置國際化的資源存儲的要點(diǎn)解析,針對用戶所使用的語言來配置資源文件,需要的朋友可以參考下
    2016-04-04

最新評論

碌曲县| 固镇县| 林州市| 武平县| 乐山市| 道孚县| 通江县| 封开县| 遂平县| 武穴市| 台中市| 阳春市| 陕西省| 义马市| 怀远县| 康保县| 西昌市| 鄢陵县| 页游| 祁东县| 水城县| 洪泽县| 承德市| 玛曲县| 溧阳市| 福贡县| 兴国县| 临西县| 伊通| 巴彦县| 三亚市| 龙海市| 清远市| 承德市| 青冈县| 济南市| 封开县| 伊吾县| 宜丰县| 昌图县| 鄂托克旗|