opencv人与摄像头距离检测

news2024/11/18 11:29:43

参考:
https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/

WeChat_20230611160620

1、cv2加载摄像头慢解决方法,单独重新cv2.VideoCapture()

https://blog.csdn.net/captain5339/article/details/128857313

class VideoCapture:
    """Customized VideoCapture, always read latest frame"""
    
    def __init__(self, name):
        self.cap = cv2.VideoCapture(name)
        self.q = queue.Queue(maxsize=3)
        self.stop_threads = False    # to gracefully close sub-thread
        th = threading.Thread(target=self._reader)
        th.daemon = True             # 设置工作线程为后台运行
        th.start()

    # 实时读帧,只保存最后一帧
    def _reader(self):
        while not self.stop_threads:
            ret, frame = self.cap.read()
            if not ret:
                break
            if not self.q.empty():
                try:
                    self.q.get_nowait() 
                except queue.Empty:
                    pass
            self.q.put(frame)

    def read(self):
        return self.q.get()
    
    def terminate(self):
        self.stop_threads = True
        self.cap.release()

cv2.putText()

2、cv2图像翻转镜像

https://blog.csdn.net/m0_38082783/article/details/128897737

img = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE) ##逆时针90
img = cv2.flip(img, 1) ##水平镜像

3、cv2.putText(),cv2.rectangle()

https://blog.csdn.net/m0_51004308/article/details/114992313

cv2.rectangle(img, (result["bbox"][0], result["bbox"][1]), (result["bbox"][2], result["bbox"][3]), (0, 0, 255), thickness=2)


cv2.putText(img,"距离:"+str(round(distance,2))+"cm",(12,50),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255),2,cv2.LINE_AA)

4、相机焦距计算

在这里插入图片描述

5、直角三角形角度计算

https://blog.csdn.net/qq_35251502/article/details/112653632

import math

math.acos(30/ distance) *180/3.14159
在这里插入代码片

整体代码

# coding=utf-8
import cv2
import insightface
import numpy as np

import queue
import threading
import time
# 自定义无缓存读视频类
class VideoCapture:
    """Customized VideoCapture, always read latest frame"""
    
    def __init__(self, name):
        self.cap = cv2.VideoCapture(name)
        self.q = queue.Queue(maxsize=3)
        self.stop_threads = False    # to gracefully close sub-thread
        th = threading.Thread(target=self._reader)
        th.daemon = True             # 设置工作线程为后台运行
        th.start()

    # 实时读帧,只保存最后一帧
    def _reader(self):
        while not self.stop_threads:
            ret, frame = self.cap.read()
            if not ret:
                break
            if not self.q.empty():
                try:
                    self.q.get_nowait() 
                except queue.Empty:
                    pass
            self.q.put(frame)

    def read(self):
        return self.q.get()
    
    def terminate(self):
        self.stop_threads = True
        self.cap.release()


class FaceRecognition:
    def __init__(self, gpu_id=0, face_db='face_db', threshold=1.24, det_thresh=0.50, det_size=(640, 640)):
        """
        人脸识别工具类
        :param gpu_id: 正数为GPU的ID,负数为使用CPU
        :param face_db: 人脸库文件夹
        :param threshold: 人脸识别阈值
        :param det_thresh: 检测阈值
        :param det_size: 检测模型图片大小
        """
        self.gpu_id = gpu_id
        self.face_db = face_db
        self.threshold = threshold
        self.det_thresh = det_thresh
        self.det_size = det_size

        # 加载人脸识别模型,当allowed_modules=['detection', 'recognition']时,只单纯检测和识别
        self.model = insightface.app.FaceAnalysis(root='./',
                                                #   allowed_modules=None,
                                                  allowed_modules=['detection', 'recognition'],
                                                  providers=['CUDAExecutionProvider'])
        self.model.prepare(ctx_id=self.gpu_id, det_thresh=self.det_thresh, det_size=self.det_size)

        # 检测人脸
    def detect(self, image):
        faces = self.model.get(image)
        results = list()
        for face in faces:
            result = dict()
            # 获取人脸属性
            result["bbox"] = np.array(face.bbox).astype(np.int32).tolist()
            # result["kps"] = np.array(face.kps).astype(np.int32).tolist()
            # print(np.array(face.landmark_3d_68))
            # result["landmark_3d_68"] = np.array(face.landmark_3d_68).astype(np.int32).tolist()
            # result["landmark_2d_106"] = np.array(face.landmark_2d_106).astype(np.int32).tolist()
            # result["pose"] = np.array(face.pose).astype(np.int32).tolist()
            # result["age"] = face.age
            # gender = '男'
            # if face.gender == 0:
            #     gender = '女'
            # result["gender"] = gender
            # 开始人脸识别
            # embedding = np.array(face.embedding).reshape((1, -1))
            # embedding = preprocessing.normalize(embedding)
            # result["embedding"] = embedding
            results.append(result)
        return results
    


if __name__ == '__main__':

    face_recognitio = FaceRecognition()
 
    # 开启ip摄像头
    cv2.namedWindow("camera")
    # 这个地址就是下面记下来的局域网IP
    video = "http://admin:admin@192.168.0.154:8081"  # 此处@后的ipv4 地址需要修改为自己的地址
    # video = "rtsp://admin:admin@192.168.0.154:8554/live" 
    # capture = cv2.VideoCapture(0)
    # success, img = capture.read()
    capture = VideoCapture(0)
    img = capture.read()
    index = 0
    imgname = -1
    while True:
        
        cv2.imshow("camera", img)
        # success, img = capture.read()
        img = capture.read()

        # img = cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE) ##逆时针90
        img = cv2.flip(img, 1) ##水平镜像
        
        print("图像大小:",img.shape)
        index+=1
        # 不进行旋转
        
 
        # 人脸检测
        # img = cv2.imdecode(np.fromfile(img, dtype=np.uint8), -1)
        
        if index//10==0:
            # 人脸识别
            results = face_recognitio.detect(img)
            for result in results:
                cv2.rectangle(img, (result["bbox"][0], result["bbox"][1]), (result["bbox"][2], result["bbox"][3]), (0, 0, 255), thickness=2)
                print('人脸框坐标:{}'.format(result["bbox"]))
                print("人脸宽像素:",result["bbox"][2]-result["bbox"][0])
                # print("人脸摄像头距离:",481.5*13.5/(result["bbox"][2]-result["bbox"][0]))
                # cv2.putText(img,str(round(481.5*13.5/(result["bbox"][2]-result["bbox"][0]),2))+"cm",(10,500),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255),2,cv2.LINE_AA)
                distance = 607*13.5/(result["bbox"][2]-result["bbox"][0])
                print("人脸摄像头距离:",distance)
                import math
                print("人脸摄像头角度:",math.acos(30/ distance) *180/3.14159)
                cv2.putText(img,"距离:"+str(round(distance,2))+"cm",(12,50),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255),2,cv2.LINE_AA)

            
            index=0 



        # if key == 27:
        #     # 按esc键退出
        #     print("esc break...")
        #     break
        # 4 若键盘按下q则退出播放
        if cv2.waitKey(20) & 0xff == ord('q'):
            break
 
       
 
    capture.release()
    cv2.destroyWindow("camera")

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用vue进行Lodop打印的一些方法

文章目录 使用Lodop进行打印的一般步骤vue中使用lodopkr-print-designer简介打印模板设计器打印预览模板设计页面安装引入 Lodop是一个JavaScript控件,用于在Web应用程序中进行打印操作。 使用Lodop进行打印的一般步骤 下载Lodop控件:首先,你…

对比学习做了什么?

什么是对比学习? 对比学习貌似处于“无明确定义、有指导原则”的状态 什么是对比学习呢?(这个是微信链接)全文比较长,但是逻辑框架还是不错的。 如果想要更快速的了解什么是对比学习或者说对比学习是怎么做的,可以看SimCLR这个模…

全网最详细,软件测试-性能测试岗面试题总结(大全)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 描述一下你们公司…

论文阅读:Denoising Diffusion Probabilistic Models

论文阅读:Denoising Diffusion Probabilistic Models 最近一两年,在图像生成领域,扩散模型受到了越来越多的关注,特别是随着 DALL-E2 以及 Midjourney 的持续火爆,扩散模型也变得越来越流行,之前很多基于 …

C++ 参数的三种传递方式和应用场景

C 参数的三种传递方式分别是值传递、指针传递和引用传递。 值传递 值传递的实质 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参和实参分别占用不同的存储单元。 值传递的特点 值传递的特点是单向传递,即主调函数…

Java Web开发实战经典学习过程笔记

Java Web开发实战经典学习简单笔记 第一章 Java Web 开发简介 1.胖客户端程序指的是,当一个程序运行时需要一个单独的客户端程序支持(如:QQ)。瘦客户端程序在操作时不需要任何其他程序的安装(如:登录网上论坛,只需浏览器即可)。 2…

I.MX6ull UART

一 简介 UART 全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低&…

Self-Attention 自注意力机制

输出形式 李宏毅讲到: 模型的输入是只有一种形式——词向量但是输出的形式却是不唯一的,主要有以下三种: 每一个向量对应一个输出(多对多,且一一对应) 每个序列只有一个输出(多对一) 一个序列对应一个序列(多对多,长…

MySQL 索引的10 个核心要点

文章目录 🍉1. 索引底层采用什么数据结构?为什么不用hash🍉2. B树与B树区别?为何用B树?🍉3. 自增主键理解?🍉4. 为什么自增主键不连续🍉5. Innodb为什么推荐用自增ID&…

代码随想录第59天

1.下一个更大元素II 有两种方法&#xff1a; 1.把两个一样的数组拼起来&#xff1a; // 版本一 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nu…

Chapter7: SpringBoot与数据访问

尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…

《Reinforcement Learning: An Introduction》第4章笔记

Chapter 4 Dynamic Programming 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一类在给定完备环境模型的MDP后用来计算最优策略的算法。动态规划算法在强化学习中因为&#xff1a;1. 假设有一个完美的环境模型&#xff1b;2. 极大的计算代价 实际用处…

树莓派4B连接不了产品开的热点

目的 关于树莓派连接不了产品开的5G热点&#xff0c; 当时还是一头雾水。 参考这篇博客 把思路方向转向了频率&#xff0c; 信道&#xff0c; 通过给的产品A相关规格说明wifi 5.18GHz, 信道36。 于是乎我两款产品A、产品B为例。 树莓派是能连接产品B开的热点&#xff08;5.74…

【Unity SRP】实现基础的Temporal AA(未完)

写在前面 【技术美术图形部分】简述主流及新的抗锯齿技术&#xff0c;花了点时间盘点了一些主流AA技术&#xff0c;再在SRP下的URP管线中实现一下目前游戏用得比较多的TAA。参考Unity的TAA&#xff08;比较容易懂&#xff09;以及sienaiwun的实现思路&#xff0c;也参考了很多…

OpenCV转换HDR图像与源码分析

我们常见的图像位深一般是8bit&#xff0c;颜色范围[0, 255]&#xff0c;称为标准动态范围SDR(Standard Dynamic Range)。SDR的颜色值有限&#xff0c;如果要图像色彩更鲜艳&#xff0c;那么就需要10bit&#xff0c;甚至12bit&#xff0c;称为高动态范围HDR(High Dynamic Range…

Docker部署ES集群、kibana、RabbitMq和chrome安装elasticsearch-head插件

文章目录 [toc] 1.安装ES集群和kibana1.1安装ES集群1.1.1 准备挂载目录1.1.2 准备配置文件1.1.3 启动命令1.1.3.0 启动前设置系统环境变量1.1.3.1 Windows10环境启动命令1.1.3.2 Linux环境启动命令 1.2安装kibana1.2.1 准备挂载目录1.2.2 准备配置文件1.2.3 启动命令1.2.3.1 Wi…

Spring IOC基于XML和注解管理Bean(一)

Spring IOC基于XML和注解管理Bean&#xff08;二&#xff09; 文章目录 1、IoC容器1.1、控制反转&#xff08;IoC&#xff09;1.2、依赖注入1.3、IoC容器在Spring的实现 2、基于XML管理Bean2.1、搭建模块spring-first2.2、实验一&#xff1a;获取bean①方式一&#xff1a;根据i…

过滤器和拦截器实现

说明&#xff1a;当用户未经登录&#xff0c;直接访问后台网址时&#xff0c;为了避免可以直接访问后台内容&#xff0c;就需要使用过滤器或拦截器将此类请求在服务器响应数据之前做核对&#xff0c;如果未登录&#xff0c;则驳回请求&#xff0c;返回登录页面&#xff0c;如果…

PyQt5桌面应用开发(20):界面设计结果自动测试(一)

本文目录 PyQt5桌面应用系列PyQt5的测试驱动开发&#xff08;Test-Driven Development&#xff0c;TDD&#xff09;QTestUI动作函数信号测试 最平凡的例子unittest框架总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开…

【Apache Pinot】简单聊聊前面没讲的 Deep Store 和 Cluster

背景 前面3篇文章讲解了 Pinot 用的最多的几个组件&#xff0c;现在就聊最后剩下的两个&#xff0c;一个是 Cluster&#xff0c;另外一个就是 Deep Store。 Cluster 其实 Cluster 比较简单&#xff0c;就是一个概念的集合&#xff0c;他说有 Server&#xff0c;Broker 和 Co…