第三篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:物体检测与识别

news2024/12/24 21:57:14

传奇开心果短博文系列

  • 系列短博文目录
    • Python的OpenCV库技术点案例示例短博文系列
  • 短博文目录
    • 一、项目目标
    • 二、OpenCV物体检测与识别介绍
    • 三、分别示例代码
    • 四、扩展示例代码

系列短博文目录

Python的OpenCV库技术点案例示例短博文系列

短博文目录

一、项目目标

人脸识别物体检测与识别:包括人脸识别、目标检测、目标跟踪等功能。OpenCV

二、OpenCV物体检测与识别介绍

物体检测与识别OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。在物体检测与识别领域,OpenCV可以用于实现包括人脸识别、目标检测、目标跟踪等功能。

以下是一些常见的物体检测与识别功能,可以使用OpenCV实现:

  1. 人脸检测与识别:OpenCV提供了基于Haar特征的级联分类器(Cascade Classifier),可以用于检测和识别人脸。通过使用训练好的级联分类器,可以在图像或视频中检测出人脸,并进行人脸识别和人脸特征提取。

  2. 目标检测:OpenCV提供了多种目标检测算法,如基于Haar特征的级联分类器、HOG(Histogram of Oriented Gradients)、DNN(Deep Neural Networks)等。这些算法可以用于检测图像或视频中的不同类型的目标,如车辆、行人、动物等。

  3. 目标跟踪:OpenCV提供了多种目标跟踪算法,如基于光流的方法(如Lucas-Kanade光流算法)、基于特征匹配的方法(如SIFT、SURF)以及基于深度学习的方法(如DeepSORT)。这些算法可以用于跟踪目标在视频序列中的位置和运动。

除了上述功能,OpenCV还提供了其他图像处理和计算机视觉的功能,如图像滤波、边缘检测、图像分割、特征提取、图像配准等。它支持多种5编程语言,如C++、Python、Java等,并且具有跨平台的特性,可以在不同的操作系统上使用。

三、分别示例代码

以下是使用OpenCV进行人脸识别、目标检测和目标跟踪的示例代码:

人脸识别1. 人脸识别示例代码:

import cv2

# 加载级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载图像
image = cv2.imread('face_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 标记人脸
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示结果
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述2. 目标检测示例代码:

import cv2

# 加载级联分类器
car_cascade = cv2.CascadeClassifier('cars.xml')

# 加载视频
video = cv2.VideoCapture('car_video.mp4')

while True:
    # 读取视频帧
    ret, frame = video.read()

    if not ret:
        break

    # 转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测车辆
    cars = car_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 标记车辆
    for (x, y, w, h) in cars:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 显示结果
    cv2.imshow('Car Detection', frame)
    if cv2.waitKey(1) == ord('q'):
        break

# 释放资源
video.release()
cv2.destroyAllWindows()

在这里插入图片描述3. 目标跟踪示例代码:

import cv2
import dlib

# 加载目标跟踪器
tracker = dlib.correlation_tracker()

# 加载视频
video = cv2.VideoCapture('object_video.mp4')

# 读取第一帧
ret, frame = video.read()
if not ret:
    exit()

# 选择目标区域
bbox = cv2.selectROI(frame, False)

# 初始化目标跟踪器
tracker.start_track(frame, dlib.rectangle(*bbox))

while True:
    # 读取视频帧
    ret, frame = video.read()

    if not ret:
        break

    # 更新目标跟踪器
    tracker.update(frame)
    pos = tracker.get_position()

    # 提取目标位置
    x = int(pos.left())
    y = int(pos.top())
    w = int(pos.width())
    h = int(pos.height())

    # 标记目标
    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 显示结果
    cv2.imshow('Object Tracking', frame)
    if cv2.waitKey(1) == ord('q'):
        break

# 释放资源
video.release()
cv2.destroyAllWindows()

请注意,示例代码中使用的级联分类器和训练数据文件(如haarcascade_frontalface_default.xmlcars.xml)可以从OpenCV官方网站或其他资源库中获取。目标跟踪示例中使用了dlib库,你需要确保已经安装了dlib库。

四、扩展示例代码

当涉及到物体检测与识别时,OpenCV提供了许多功能和算法,可以根据不同的需求进行扩展和定制。以下是一些示例代码,演示了如何使用OpenCV进行更高级的物体检测与识别:

在这里插入图片描述1. 使用深度学习模型进行目标检测:

import cv2

# 加载预训练的深度学习模型
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')

# 加载图像
image = cv2.imread('object_image.jpg')

# 创建一个blob,将图像输入到网络中
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 0.007843, (300, 300), 127.5)

# 设置输入层
net.setInput(blob)

# 运行前向传播,获取输出层
detections = net.forward()

# 解析检测结果
for i in range(detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    
    if confidence > 0.5:
        # 提取边界框坐标
        box = detections[0, 0, i, 3:7] * np.array([image.shape[1], image.shape[0], image.shape[1], image.shape[0]])
        (startX, startY, endX, endY) = box.astype("int")
        
        # 绘制边界框和置信度
        cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 2)
        text = "{:.2f}%".format(confidence * 100)
        y = startY - 10 if startY - 10 > 10 else startY + 10
        cv2.putText(image, text, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# 显示结果
cv2.imshow("Object Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述2. 使用深度学习模型进行人脸识别:

import cv2

# 加载预训练的深度学习模型和人脸特征向量
net = cv2.dnn.readNetFromTorch('model.t7')
embeddings = np.load('embeddings.npy')

# 加载图像
image = cv2.imread('face_image.jpg')

# 人脸检测
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 对每个人脸进行识别
for (x, y, w, h) in faces:
    face = image[y:y+h, x:x+w]
    face_blob = cv2.dnn.blobFromImage(face, 1.0, (96, 96), (0, 0, 0), swapRB=True, crop=False)
    
    # 提取人脸特征向量
    net.setInput(face_blob)
    vec = net.forward().flatten()
    
    # 计算与已知特征向量的欧氏距离
    dists = np.linalg.norm(embeddings - vec, axis=1)
    min_dist_idx = np.argmin(dists)
    min_dist = dists[min_dist_idx]
    
    # 判断是否匹配
    if min_dist < threshold:
        label = labels[min_dist_idx]
        cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
        cv2.putText(image, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    else:
        cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        cv2.putText(image, 'Unknown', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)

# 显示结果
cv2.imshow("Face Recognition", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这些示例代码展示了如何使用OpenCV结合深度学习模型进行目标检测和人脸识别。你可以根据自己的需求,选择适合的深度学习模型和训练数据,并根据实际情况进行相应的调整和定制。

目标跟踪3.使用OpenCV进行目标跟踪的示例代码:

import cv2

# 创建跟踪器
tracker = cv2.TrackerCSRT_create()

# 加载视频
video = cv2.VideoCapture('object_video.mp4')

# 选择初始目标区域
ret, frame = video.read()
bbox = cv2.selectROI(frame, False)

# 初始化跟踪器
tracker.init(frame, bbox)

while True:
    # 读取视频帧
    ret, frame = video.read()

    if not ret:
        break

    # 跟踪目标
    success, bbox = tracker.update(frame)

    if success:
        # 绘制跟踪结果
        (x, y, w, h) = [int(v) for v in bbox]
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
    else:
        cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)

    # 显示结果
    cv2.imshow("Object Tracking", frame)
    if cv2.waitKey(1) == ord('q'):
        break

# 释放资源
video.release()
cv2.destroyAllWindows()

在这个示例中,我们使用了OpenCV的TrackerCSRT跟踪器来实现目标跟踪。首先,我们从视频中选择了一个初始目标区域,并使用该区域初始化跟踪器。然后,我们在每一帧中更新跟踪器,并绘制跟踪结果。

请注意,OpenCV还提供了其他几种跟踪器,如TrackerKCFTrackerMOSSE等。你可以根据具体的需求选择最适合的跟踪器。

希望这个示例代码对你有所帮助。如果你有更多问题,请随时提问。

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

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

相关文章

Pycharm终端显示PS而不显示虚拟环境venv

PS表示当前使用的是powershell.exe&#xff0c;如果你要显示虚拟环境名&#xff0c;则要改为cmd.exe 解决办法&#xff1a; 打开File-settings-Tools-Terminal-shell path 在文件中找到设置&#xff0c;在工具中找到终端 把第四个Shell路径设置为cmd.exe 3. 点击确定&#xf…

腾合力携思腾云全系列产品亮相2023算云融合产业大会

由中国信息通信研究院、中国通信标准化协会联合主办的首届算云融合产业大会于2023年3月29-30日在北京国际会议中心举办。大会围绕“云融万物 算启未来”主题&#xff0c;设置“主论坛六大分论坛”&#xff0c;覆盖产业热点领域及方向&#xff0c;全面推动我国算力云服务发展。集…

自定义错误页面在Spring Boot中的实现

引言 在SpringBoot中&#xff0c;常用的异常处理有两种&#xff1a;一种是 BasicErrorController&#xff0c;另一种是 ControllerAdvice。BasicErrorController 用于处理非Controller抛出的异常&#xff0c;而ControllerAdvice 用于处理Controller抛出的异常&#xff0c;对于…

windows vs2005编译libssh2支持sftp

windows vs2005编译libssh2支持sftp 1、编译模块 ​ 需要用到4个库&#xff1a;libcurl、libssh2、openssl、zlib 为啥要用libssh2 因为libcurl实现sftp功能依赖libssh2&#xff0c;是对libssh2的封装。 所以也可以直接用libssh2实现sftp。 为啥要用openssl 因为libssh2依…

【linux】查看进程和子进程

在Linux系统中&#xff0c;可以使用多个命令来查看进程及其子进程。以下是一些常用的方法&#xff1a; 1. ps 命令 ps 命令用于显示当前进程的状态。可以结合不同的选项来查看进程及其子进程。 查看进程树&#xff1a; ps -auxf - -a 显示所有进程。 - -u 显示进程的用户/所…

AI伦理边界:探索人工智能伦理计算

大家好&#xff0c;近年学界与工业界都已开始关注并热议 AI 伦理治理问题&#xff0c;也在伦理规范研究上取得了初步进展。然而&#xff0c;由于 AI 伦理的抽象性&#xff0c;如何定量化度量智能系统的伦理&#xff0c;还是一个未知的难题。 李学龙教授团队在《中国科学&#…

【学网攻】 第(5)节 -- Cisco VTP的使用

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资…

apple watch开通esim(一号双终端)报错解决方法

写在前面&#xff1a; 本文不一定可以解决您问题&#xff0c;本文记录了作者在遇到该情况时的处理办法&#xff0c;导致这个问题的原因会有很多&#xff0c;本文仅记录部分&#xff0c;仅供读者参考。与客服人员沟通时&#xff0c;请避免说esim&#xff0c;大多数客服人员不一定…

windbg :查看局部变量值

查看变量有以下几种常用方式&#xff1a; 仍以我们上篇 &#xff1a; 《windbg : x 命令》中的代码作为示例来讲解使用。 源码&#xff1a; #include <iostream>using namespace std;struct JKGirl{std::string name;int age;friend ostream& operator <<(o…

【机器学习300问】17、什么是欠拟合和过拟合?怎么解决欠拟合与过拟合?

一个问题出现了&#xff0c;我们首先要描述这个问题&#xff0c;然后分析问题出现的原因&#xff0c;找到原因后提出解决方案。废话不多说&#xff0c;直接上定义&#xff0c;然后通过回归和分类任务的例子来做解释。 一、什么是欠拟合和过拟合&#xff1f; &#xff08;1&am…

面试题:String s = new String(“xyz“) 创建了几个对象?

项目场景&#xff1a; 今天分享一篇基础技术面试题。 这个问题相信每个学习 java 的同学都不陌生&#xff0c;作为一个经典的面试题&#xff0c;到现在工作这么多年了我真是认为挺操蛋的一个问题&#xff0c;在网上到现在你仍然可以看见很多讨论这个问题的人&#xff0c;其中不…

酷开科技 | 酷开系统体育频道燃爆体育赛事,为偶像疯狂打CALL

体育竞技&#xff0c;总会带给我们激情澎湃的感受&#xff0c;兴奋、激动、热血&#xff0c;这些瞬间也许就是竞技体育的魅力&#xff01;酷开科技通过酷开系统的体育频道&#xff0c;为广大体育迷们提供了一个观赛平台。在这个平台上&#xff0c;你可以欣赏到各类体育赛事的精…

用JavaFX写了一个简易的管理系统

文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …

JVM/GC复习1---更新中

JVM/GC JVMGC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器Young GC模式Mixed GCFull GC JVM 待更新中ing GC 垃圾回收:程序运行的时候必…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

【JSON2WEB】03 go的模板包html/template的使用

Go text/template 是 Go 语言标准库中的一个模板引擎&#xff0c;用于生成文本输出。它使用类似于 HTML 的模板语言&#xff0c;可以将数据和模板结合起来&#xff0c;生成最终的文本输出。 Go html/template包实现了数据驱动的模板&#xff0c;用于生成可防止代码注入的安全的…

一文掌握Shell

文章目录 Shell概述脚本的常用执行方式Linux中的sh解释器Linux中的/etc 编写sh脚本第一个sh脚本变量1. 系统预定义变量2. 自定义变量3. 变量定义规则单引号和双引号的区别 4. 特殊变量 运算符命令替换条件判断常用判断语句 流程控制if语句case语句while循环 read读取控制台输入…

生产、计划、仓库、质量,一大堆的工厂数据要怎么收集?MES系统替你解决!

随着制造业的发展和进步&#xff0c;工厂运营面临着越来越多的挑战&#xff0c;特别是在数据管理和生产过程控制方面。生产、计划、仓库、质量等方面的数据分散在各个系统和部门中&#xff0c;数据的收集和分析变得复杂而困难。然而&#xff0c;MES系统为工厂提供了一个综合性解…

成功安装DCNv4

最终结果 终于安装成功了。 环境 系统&#xff1a;ubuntu22.04 CUDA&#xff1a;12.1 python&#xff1a;3.11 显卡驱动&#xff1a;545 安装过程 系统、CUDA和python的安装过程忽略&#xff0c;这些都能找到。这里只写不同的地方。 配置CUDAHOME 执行命令“ gedit ~/…

余弦定理是怎么推导的?

余弦定理是怎么推导的? 已知余弦定理(low of cosines)表达如下: A B 2 = B C 2 + A C 2 − 2 B C ∗ A C ∗ cos ⁡ θ AB^2=BC^2+AC^2-2BC*AC*\cos \theta AB2=BC2+AC2−2BC∗AC∗cosθ,其中 A B , B C , A C AB,BC,AC AB,BC,AC和 θ \theta θ的关系如下: 那么这个公式是…