OpenCV目标检测Meanshif和Camshift算法解析

OpenCV目标检测Meanshif和Camshift算法解析

本文旨在对OpenCV中的Meanshift和Camshift算法进行解析,给读者提供OpenCV目标检测的攻略。

什么是Meanshift

Meanshift算法最初是用于图像压缩的,但是这个算法可以用于计算对象在图像中的位置。在计算机视觉中,Meanshift算法被广泛应用于目标跟踪任务。

Meanshift算法首先需要选择一块需要跟踪的区域,通常是矩形或者圆形。然后,根据此区域的颜色分布计算出“重心”(图像直方图峰值区域的中心点)。接着,将此中心点作为新的区域重心计算出来,并不断重复此过程直到重心位置不再移动。

Meanshift算法使用简单,对于非刚性变形,颜色不变等情况能够得到较好的跟踪效果。

Meanshift示例

下面的示例展示了Meanshift算法的使用。我们选择一张含有绿色叶子的图片,然后在图片上选择一块区域进行跟踪。

import cv2

# 读入图片
img = cv2.imread("leaf.jpg")

# 选择需要跟踪的区域
r,h,c,w = 250,90,400,125  
track_window = (c,r,w,h)

# 提取所选择区域的直方图
roi = img[r:r+h, c:c+w]
hsv_roi =  cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# 创建一个窗口并展示所选择的区域
cv2.namedWindow('roi')
cv2.imshow('roi',roi)

# 对视频帧进行处理,不断更新跟踪框的位置
cap = cv2.VideoCapture(0)

while(1):
    ret ,frame = cap.read()
    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # 使用Meanshift算法
        ret, track_window = cv2.meanShift(dst, track_window, termination=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1))

        # 在原图上画出跟踪框
        x,y,w,h = track_window
        img2 = cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)
        cv2.imshow('img2',img2)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
    else:
        break

cv2.destroyAllWindows()
cap.release()

执行以上代码,选择一块叶子区域,再运行后打开摄像头,会发现跟踪框始终在叶子区域内。

什么是Camshift

Camshift是Meanshift的一种变体,由Gary R. Bradsky在OpenCV的文献中提出。Camshift算法在Meanshift的基础上进行了改进,处理非刚性变形能力更强。Camshift可以自适应地调整所选择区域的大小和形状,从而能够更好地跟踪目标对象。

Camshift算法首先利用Histogram Back Projection(直方图反向投影)得到目标对象的区域,并执行Meanshift算法,得到对象的中心点。然后,在新的样本区域中计算出新的直方图,并以此更新原来的直方图。在计算出新直方图并执行Meanshift算法所得到的中心坐标与原构算出的中心坐标不同的情况下,即目标对象发生运动或变形的情况下,Camshift会重新调整目标区域的大小和形状,再次运行直方图反向投影、更新直方图和执行Meanshift算法的过程。

Camshift示例

下面的代码展示了Camshift算法的使用。我们在一个静态图片中选择一个区域用于跟踪,并且在每一帧上更新该区域的形状和大小,从而使跟踪始终跟随目标移动。

import cv2
import numpy as np

# 读入图片
img = cv2.imread('bird.jpg')

# 选择跟踪的区域
r,h,c,w = 250,100,400,150  
track_window = (c,r,w,h)

# 提取所选择区域的直方图
roi = img[r:r+h, c:c+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# 设置终止条件
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

# 打开摄像头,进行CamShift算法处理
cap = cv2.VideoCapture(0)
while(1):
    ret ,frame = cap.read()

    # 识别对象的直方图来跟踪
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

    # 关键步骤,使用CamShift跟踪
    ret, track_window = cv2.CamShift(dst, track_window, term_crit)

    # 进行图像的矩形绘制
    pts = cv2.boxPoints(ret)
    pts = np.int0(pts)
    img2 = cv2.polylines(frame,[pts],True, 255,2)
    cv2.imshow('img2',img2)

    k = cv2.waitKey(60) & 0xff
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()

执行以上代码,选择一块鸟的区域,然后打开摄像头,会发现跟踪框一直跟随着鸟移动。

结论

本文详细介绍了OpenCV中的Meanshift和Camshift算法,展示了两个实例来说明算法的使用方法。通过这些示例,读者可以学会如何使用Meanshift和Camshift算法来进行目标跟踪。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenCV目标检测Meanshif和Camshift算法解析 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Python OpenCV绘制各类几何图形详解

    下面是Python OpenCV绘制各类几何图形的完整攻略: 前言 在计算机视觉的应用中,常常需要在图像上绘制各种几何图形,如:线段、矩形、圆等等。本文将详细讲解如何使用Python的OpenCV库在图像上绘制各类几何图形。 绘制线段 OpenCV中提供了cv2.line()函数来绘制线段,函数原型如下: cv2.line(img, pt1, pt2, co…

    人工智能概论 2023年5月25日
    00
  • 分布式医疗挂号系统EasyExcel导入导出数据字典的使用

    分布式医疗挂号系统EasyExcel导入导出数据字典的使用 简介 分布式医疗挂号系统是一款以医院挂号业务为主线,为广大患者提供线上看病、在线咨询、预约挂号、处方购买等全方位一站式服务的医疗系统。数据字典是该系统中重要的文档,用于记录系统中各种实体和字段的相关信息,方便管理和开发人员查看和使用。本文主要介绍EasyExcel导入导出数据字典的使用。 什么是Ea…

    人工智能概览 2023年5月25日
    00
  • Python+AI实现给老照片上色

    Python+AI实现给老照片上色攻略 给老照片上色是一个比较有趣的任务,我们可以使用Python和AI技术来完成这一任务。在此提供一个完整攻略,包括数据准备,模型训练和照片上色三个部分。 数据准备 在开始训练之前,我们需要准备数据集。可以从互联网上找到带颜色的图片作为我们的ground truth,然后将其转换为黑白照片。我们可以使用pillow库中的Im…

    人工智能概论 2023年5月25日
    00
  • java异步编程的7种实现方式小结

    Java异步编程的7种实现方式小结 在Java中进行异步编程,可以提高程序性能,避免程序阻塞。本文将介绍Java异步编程的7种实现方式。 1. 异步回调 异步回调是Java中比较常见的实现方式,其通过传递回调函数的方式进行异步调用。当一个异步操作完成时,调用回调函数来处理结果。 示例代码: public interface Callback<T>…

    人工智能概览 2023年5月25日
    00
  • windows消息和消息队列实例详解

    简介 Windows 消息机制是 Windows 操作系统中一种相对底层的程序设计模式,它的本质是一种事件通知机制。应用程序可以通过窗口句柄向系统发送一个消息,处理消息的窗口可以收到消息并作出相应动作。消息队列则是用来维护消息的队列数据结构。 消息类型 Windows 消息可以分为三类:系统预定义消息、应用程序自定义消息和控件通知消息。 系统预定义消息 Wi…

    人工智能概览 2023年5月25日
    00
  • pytorch随机采样操作SubsetRandomSampler()

    PyTorch 中的 SubsetRandomSampler 类是一种用于随机采样数据集的方法。它可以用于生成一个索引列表,该列表可以被 DataLoader 类(或其他任何需要索引列表的类)用于加载数据集子集。 使用方法示例 下面是使用 SubsetRandomSampler 的基本方法: import torch from torch.utils.dat…

    人工智能概论 2023年5月25日
    00
  • Java Web实现自动登陆功能

    实现Java Web自动登录功能,一般需要以下步骤: 用户登录时,将用户名和密码传到后台,后台进行验证 在前端页面中,我们需要添加一个表单,输入用户名和密码等登录信息,然后点击登录按钮提交表单。 示例代码: <form action="login" method="post"> <label for=…

    人工智能概论 2023年5月25日
    00
  • node.js基础知识汇总

    Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境,它能使JavaScript运行在服务器端,具有单线程、非阻塞I/O以及事件驱动等特点。本文将全面介绍Node.js的基础知识,以便让初学者更好地了解和使用Node.js。 安装Node.js 在开始学习Node.js之前,需要先安装Node.js。在Node.js官网上(htt…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部