opencv人与摄像头距离、角度检测

news2024/11/25 7:02:15

参考:
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://www.fke6.com/html/45S8FFN822LM.html
https://www.cnblogs.com/shuangcao/p/11344436.html
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、相机焦距计算

参考:
https://www.30pf.com/n/259.html
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/

首先第一步要计算出相机的焦距,所以要人提前去实际距离拍一张确定的图片算出具体焦距,
print(“人脸摄像头距离:”,481.5*13.5/(result[“bbox”][2]-result[“bbox”][0]))
在这里插入图片描述

5、直角三角形角度计算

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

import math

math.acos(30/ distance) *180/3.14159

6、cv2截图

# 输入两个对角点的坐标,裁剪图片
def cut_pic(img_path, point_list):
    [(x1, y1), (x2, y2)] = point_list
    # img = cv2.imread(img_path)
    # img = np.array(img)
    # 新图片
    # print(img.shape)
    # 此处注意opencv的顺序是先h,后w,然后c。
    img_new = img_path[y1:y2, x1:x2, :]
    cv2.imwrite("save.png", img_new)

##截图(人脸识别框截图人脸坐标)
cut_pic(img, [(result["bbox"][0]-15, result["bbox"][1]-20), (result["bbox"][2]+15, result["bbox"][3]+20)])

整体代码

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

import queue
import threading
import time

# 输入两个对角点的坐标,裁剪图片
def cut_pic(img_path, point_list):
    [(x1, y1), (x2, y2)] = point_list
    # img = cv2.imread(img_path)
    # img = np.array(img)
    # 新图片
    # print(img.shape)
    # 此处注意opencv的顺序是先h,后w,然后c。
    img_new = img_path[y1:y2, x1:x2, :]
    cv2.imwrite("save.png", img_new)


# 自定义无缓存读视频类
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)
                ##截图
                cut_pic(img, [(result["bbox"][0], result["bbox"][1]-20), (result["bbox"][2], result["bbox"][3]+20)])
                
                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/648187.html

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

相关文章

新《终结者》电影剧本或交由 ChatGPT 书写

据外媒报道,詹姆斯・卡梅隆透露他正在创作下一部《终结者》电影的剧本,他同时表示新剧本的灵感得益于 OpenAI 的 ChatGPT。 打开豆瓣,1984年10月上映的那部「终结者」评分依然在8分以上。而后,终结者系列的电影不断上新&#xff…

基于Java房屋租售网站设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

考研计算机组成思维导图总结(408,833,834)

需要思维导图文件和图片的可以去我的Github上寻找,这份思维导图参考23年王道机组,同时添加了一部分833,834需要知识点。 注意:最后的机组知识点仍要以学院进行对照,这里只是提供参考 思维导图pdf和知识点图片 文章目…

<Linux> 《SUSE Linux 中SSH安全加固》

《SUSE Linux 中SSH安全加固》 1 说明2 安全加固2.1 更改 ssh 默认端口2.2 限制 ROOT 远程登陆2.3 修改默认登录时间2.4 升级旧版本2.5 当用户处于非活动时断线2.6 修改加密协议版本2.7 限制 IP 登录2.8 允许或禁止指定用户和组登录2.9 限制监听 IP2.10 最后修改配置文件的属性…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具,要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具,你就可以监控到java虚拟机的gc过程了 那么,这么强大的工具怎么下载呢&…

【HBZ分享】FactoryBean的应用 与 BeanFactroyPostProcessor的应用 与 BeanPostProcesser的应用

FactoryBean的应用实战 需要写一个A类来实现FactoryBean实现FactoryBean的3个方法,即getOject(), getObjectType(), isSingleton()注意:在通过xml的【 】标签或者通过注解方式将A类注入容器的时候,返回的实例不是A类,而是T类&…

HTML 基础

目录 HTML 结构 1.认识 HTML 标签 HTML 文件基本结构 标签层次结构 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 关于目录结构: 超链接标签: a 链接的几种形式: 表格标签 合并单元格 列表标签 表单标签 form …

【头歌-Python】Python第九章作业(初级)第 1、2、4 关

第1关:绘制温度曲线 任务描述 附件中是某月每天的最高温度和最低温度数据,请绘制本月的高温曲线(红色、圆点标记坐标)和低温曲线(蓝色、星号标记坐标),线型、刻度如输出示例所示,线…

Rust每日一练(Leetday0031) 解码方法、复原 IP 地址

目录 91. 解码方法 Decode Ways 🌟🌟 93. 复原 IP 地址 Restore IP Addresses 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 91. …

chatgpt赋能python:Python如何求平均

Python如何求平均 Python是一种非常流行的编程语言,它被广泛应用于各种领域,包括科学计算、数据分析、Web开发等。在这篇文章中,我们将介绍如何使用Python求平均值。 什么是平均数 平均数,也称为均值,是指一组数据的…

chatgpt赋能python:Python怎么求平均值?全面解析平均值计算方法

Python怎么求平均值?全面解析平均值计算方法 作为一种简洁易用的计算机编程语言,Python的应用范围已经越来越广泛。在Python中,我们可以轻松地进行各种统计和计算工作,其中求平均值是最常见的计算之一。在本文中,我们…

Redis过期策略

Redis 使用的过期删除策略是什么? Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存…

Redis 持久化-RDB和 持久化-AOF 的详细介绍以及区别

Redis 持久化-RDB 官方资料 在线文档: https://redis.io/topics/persistence 持久化方案 RDB(Redis DataBase) AOF(Append Of File) RDB 是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就Snapsh…

java中获取配置文件路径中含有中文,出现乱码的情况解决方案

问题背景:读取配置文件,但是读到的目录信息是中文乱码的。 第一步: 参考代码如上截图,方法即:读取jdbc配置,获取了配置文件(jdbc.properties)地址,然后加载这个文件读取…

chatgpt赋能python:Python中如何消除空格:从基础操作到高级技巧

Python中如何消除空格:从基础操作到高级技巧 Python是一种广泛使用的编程语言,深受许多工程师和开发者的喜爱。其中一个有用的技巧是如何消除字符串中的空格,特别是在处理和分析文本时。在本文中,我们将介绍三种不同的方法来解决…

springboot+vue+java学生选课成绩系统awwm9

主要内容: (1) 系统用户由三类组成:教师、学生和管理员 (2) 管理员负责的主要功能: 1. 用户进入登录界面,输入用户名,密码,选择管理员用户类型,然后点击“登录”按钮,后台验证…

Linux系统:stress-ng测压工具

目录 一、理论 1.stress工具简介与安装 2.语法及参数 3.具体安装 二、实验 1.运行8 cpu, 4 fork, 5 hdd, 4 io, 50 vm, 10小时 2.CPU测试 3.内存测试 4.IO测试 5.磁盘及I/O测试 三、问题 1. -bash: ./configure: 没有那个文件或目录 2. 下载yum源报错:未…

读发布!设计与部署稳定的分布式系统(第2版)笔记03_让系统稳定运行

1. 概念 1.1. 事务 1.1.1. 系统处理的抽象工作单元 1.1.1.1. 与数据库事务不同 1.1.1.2. 单个工作单元可能包含许多数据库事务 1.1.2. 系统存在的原因 1.1.2.1. 如果一个系统只能处理一种事务,那么它就是专用系统 1.1.2.2. 混合工作负载是系统能处理的不同事…

从 Google 删库,到蚂蚁跑路,Care 与 Fear 点燃的 Flare

Bytebase 第一次完成融资后写了一篇文章,主要讲了从行业层面做 Bytebase 的逻辑。一年过去了,这一年我们所处的开源/infra/数据库/企业服务赛道从热点归于平静,尤其在国内,又习惯性地反应过度,直接降到冰点。但从全球来…