首页 > 其他分享 >opencv调用摄像头并输出位置信息

opencv调用摄像头并输出位置信息

时间:2024-11-30 16:33:07浏览次数:9  
标签:box 调用 name img write opencv output 摄像头 cls

import cv2
import numpy as np
import onnxruntime
import xlsxwriter
import os

# coco80类别
CLASSES = ['card']


class YOLOV5():
    def __init__(self, onnxpath):
        self.onnx_session = onnxruntime.InferenceSession(onnxpath)
        self.input_name = self.get_input_name()
        self.output_name = self.get_output_name()

    def get_input_name(self):
        input_name = []
        for node in self.onnx_session.get_inputs():
            input_name.append(node.name)
        return input_name

    def get_output_name(self):
        output_name = []
        for node in self.onnx_session.get_outputs():
            output_name.append(node.name)
        return output_name

    def get_input_feed(self, img_tensor):
        input_feed = {}
        for name in self.input_name:
            input_feed[name] = img_tensor
        return input_feed

    def inference(self, img):
        or_img = cv2.resize(img, (640, 640))
        img = or_img[:, :, ::-1].transpose(2, 0, 1)  # BGR2RGB和HWC2CHW
        img = img.astype(dtype=np.float32)
        img /= 255.0
        img = np.expand_dims(img, axis=0)
        input_feed = self.get_input_feed(img)
        pred = self.onnx_session.run(None, input_feed)[0]
        return pred, or_img


# dets:  array [x,6] 6个值分别为x1,y1,x2,y2,score,class
# thresh: 阈值
def nms(dets, thresh):
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    areas = (y2 - y1 + 1) * (x2 - x1 + 1)
    scores = dets[:, 4]
    keep = []
    index = scores.argsort()[::-1]

    while index.size > 0:
        i = index[0]
        keep.append(i)
        x11 = np.maximum(x1[i], x1[index[1:]])
        y11 = np.maximum(y1[i], y1[index[1:]])
        x22 = np.minimum(x2[i], x2[index[1:]])
        y22 = np.minimum(y2[i], y2[index[1:]])

        w = np.maximum(0, x22 - x11 + 1)
        h = np.maximum(0, y22 - y11 + 1)

        overlaps = w * h
        ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)
        idx = np.where(ious <= thresh)[0]
        index = index[idx + 1]
    return keep


def xywh2xyxy(x):
    y = np.copy(x)
    y[:, 0] = x[:, 0] - x[:, 2] / 2
    y[:, 1] = x[:, 1] - x[:, 3] / 2
    y[:, 2] = x[:, 0] + x[:, 2] / 2
    y[:, 3] = x[:, 1] + x[:, 3] / 2
    return y


def filter_box(org_box, conf_thres, iou_thres):
    org_box = np.squeeze(org_box)
    conf = org_box[..., 4] > conf_thres
    box = org_box[conf == True]
    cls_cinf = box[..., 5:]
    cls = []
    for i in  range(len(cls_cinf)):
        cls.append(int(np.argmax(cls_cinf[i])))
    all_cls = list(set(cls))
    output = []

    for i in range(len(all_cls)):
        curr_cls = all_cls[i]
        curr_cls_box = []
        curr_out_box = []
        for j in range(len(cls)):
            if cls[j] =  = curr_cls:
                box[j][5] = curr_cls
                curr_cls_box.append(box[j][:6])
        curr_cls_box = np.array(curr_cls_box)
        curr_cls_box = xywh2xyxy(curr_cls_box)
        curr_out_box = nms(curr_cls_box, iou_thres)
        for k in curr_out_box:
            output.append(curr_cls_box[k])
    output = np.array(output)
    return output


def draw(image, box_data):
    boxes = box_data[..., :4].astype(np.int32)
    scores = box_data[..., 4]
    classes = box_data[..., 5].astype(np.int32)

    for box, score, cl in zip(boxes, scores, classes):
        top, left, right, bottom = box
        print('class: {}, score: {}'.format(CLASSES[cl], score))
        print('box coordinate left,top,right,down: [{}, {}, {}, {}]'.format(top, left, right, bottom))

        cv2.rectangle(image, (top, left), (right, bottom), (255, 0, 0), 2)
        cv2.putText(image, '{0} {1:.2f}'.format(CLASSES[cl], score),
                    (top, left),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    0.6, (0, 0, 255), 2)


def write_to_excel(data, filename):
    with xlsxwriter.Workbook(filename) as workbook:
        worksheet = workbook.add_worksheet()
        worksheet.write('A1', '序号')
        worksheet.write('B1', '类别')
        worksheet.write('C1', '得分')
        worksheet.write('D1', 'x')
        worksheet.write('D1', 'y')
        worksheet.write('E1', 'w')
        worksheet.write('F1', 'h')

        for i, box in enumerate(data):
            x1, y1, x2, y2, score, cls = box
            x_center = (x1 + x2) / 2
            y_center = (y1 + y2) / 2
            width = x2 - x1
            height = y2 - y1

            worksheet.write(i + 2, 0, i)  # 序号
            worksheet.write(i + 2, 1, CLASSES[cls])  # 类别
            worksheet.write(i + 2, 2, score)  # 得分
            worksheet.write(i + 2, 3, x_center)  # x中心点
            worksheet.write(i + 2, 4, y_center)  # y中心点
            worksheet.write(i + 2, 5, width)  # 宽度
            worksheet.write(i + 2, 6, height)  # 高度


if __name__ == "__main__":
    onnx_path = 'C:\\yolov5-7.0\\runs\\train\\exp42\\weights\\best.onnx'
    model = YOLOV5(onnx_path)
    output_folder = 'oyt'
    excel_filename = 'result.xlsx'

    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 加载预训练的人脸识别分类器
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

    cap = cv2.VideoCapture(0)
    excel_data = []

    try:
        while True:
            ret, frame = cap.read()
            if not ret:
                break

            output, or_img = model.inference(frame)
            outbox = filter_box(output, 0.5, 0.5)
            if len(outbox) > 0:
                draw(or_img, outbox)
                cv2.imshow('YOLOv5 Detection', or_img)
                excel_data.extend(outbox)
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    break

    except Exception as e:
        print(f"程序出现错误: {e}")
    finally:
        cap.release()
        cv2.destroyAllWindows()
        write_to_excel(excel_data, excel_filename)

标签:box,调用,name,img,write,opencv,output,摄像头,cls
From: https://blog.csdn.net/jiebinchen/article/details/142641573

相关文章

  • 滑坡监测识别摄像头
    滑坡监测识别摄像头安装在潜在滑坡区域,滑坡监测识别摄像头通过捕捉实时图像,对这些图像进行深度分析,识别出可能的滑坡迹象。一旦系统检测到异常,它将立即发出预警信号,通知相关部门采取紧急措施,从而减少灾害带来的损失。滑坡监测识别摄像头的智能预警系统,不仅提高了地质灾害预警的准......
  • 人员跌倒检测摄像头
    人员跌倒检测摄像头的核心在于其搭载的深度学习算法,人员跌倒检测摄像头采用了先进的YOLOX结合OpenCV,能够高效地对视频流进行实时分析和处理,当摄像头检测到有人跌倒时,它会自动对跌倒者进行抓拍,并将当时的图像传输到管理中心。这一过程无需人工干预,大大提高了响应速度。在管理中心,系......
  • 我的RPC调用的实现
    RPC调用1.RPC的基本概念2.RPC调用的工作流程3.RPC框架4.关键技术5.RPC的优缺点总结gRPC调用1.gRPC的基本概念2.gRPC的工作流程3.gRPC通信模式4.gRPC的主要特性5.gRPC的应用场景6.gRPC的优缺点使用gRPC的时候进行自定义处理myRpcChannel类的......
  • 国标GB28181公网直播LiteGBS国标GB28181-2022平台:摄像头显示网络不发达是怎么回事?
    LiteGBS国标GB28181软件国标流媒体解决方案是一款专门用于接入国标设备的视频解决方案,不但从设备接入层面上,完整地接入了内网或者公网的国标设备,而且在输出层面上,完全采用了最新的互联网思维方式,国标IPC/NVR能通过平台同步输出RTMP/HLS/HTTP-FLV等多种视频流格式,非常好地解决了传......
  • 深入 HarmonyOS Next 系统能力调用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的系统能力调用相关技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一章:系统能力......
  • 什么是API接口?API接口的类型,如何调用API接口?
    当今互联网技术的发展越来越快,越来越多的网站和应用程序需要获取外部数据来提供更好的服务和用户体验,这就需要使用API接口。本文将会对API接口的概念、类型以及如何调用API接口进行简要介绍。一、什么是API接口?API(ApplicationProgrammingInterface)是应用程序开发接口的缩写,意......
  • 《Opencv》基础操作<1>
    目录一、Opencv简介主要特点:应用领域:二、基础操作1、模块导入2、图片的读取和显示(1)、读取(2)、显示3、图片的保存4、获取图像的基本属性5、图像转灰度图6、图像的截取7、图像的缩放8、图像的旋转9、膨胀和腐蚀操作(1)、膨胀操作(2)、腐蚀操作 10、图像的轮廓检......
  • C# 与 Python 代码互相调用的实践
    一、引言在当今的软件开发领域,不同的编程语言都有其独特的优势和适用场景。C#是一种功能强大、面向对象的编程语言,主要应用于Windows平台开发、企业级应用开发以及游戏开发(借助Unity引擎等)等领域;而Python则以其简洁的语法、丰富的库以及在数据科学、机器学习、自动化脚......
  • app.Environment.IsDevelopment、app.UseStaticFiles() 、在ASP.NET Core应用程序中,调
    在ASP.NETCore应用程序中,app.UseStaticFiles()是一个中间件方法,用于启用对静态文件的服务。这意味着当你的应用程序接收到对静态资源(如HTML文件、CSS文件、JavaScript文件、图片等)的请求时,UseStaticFiles中间件会处理这些请求并提供相应的文件。在ASP.NETCore应用程序中,app.E......
  • OpenCV 中的 Haar-cascade 检测
    介绍OpenCV是一个开源的计算机视觉库,它提供了许多用于图像处理和计算机视觉的功能。其中,Haar-cascade检测是一种流行的技术,通常用于目标检测,如人脸、眼睛、手部等。这种方法基于机器学习,使用一系列的矩形特征(Haar特征)来检测图像中的特定对象。Haar-cascade检测的工作原理......