python---OpenCv(二),背景分离方法较有意思

简介: python---OpenCv(二),背景分离方法较有意思

边界矩形

有两种类型的边界矩形:

旋转矩形(最小外接矩形):

是用最小面积绘制的,所以它也考虑了旋转。使用的函数是cv.minAreaRect()。它返回一个Box2D结构,其中包含以下细节-(中心(x,y),(宽度,高度),旋转角度)。但要画出这个矩形,我们需要矩形的四个角。它由函数cv.boxPoints()获得


cv.minAreaRect()函数返回一个包含以下信息的 RotatedRect 对象:

  • center:矩形的中心坐标((x, y))。
  • size:矩形的尺寸((width, height))。
  • angle:矩形的旋转角度,取值范围为 -900 度。

cv2.boxPoints(box) 返回的是构成旋转矩形的四个顶点的坐标。返回的结果是一个形状为 (4, 2) 的 NumPy 数组,其中每一行代表一个顶点的 (x, y) 坐标。这四个顶点按照特定的顺序排列,通常是按照顺时针或逆时针方向。


cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)


各个参数的含义如下:

  • image:目标图像,要在其上绘制轮廓。


  • contours:轮廓列表,每个轮廓是一个点的向量。必须是一个3维的列表,且必须是整数int


  • contourIdx:指定要绘制的轮廓的索引,如果为负数,则绘制所有轮廓。


  • color:绘制轮廓的颜色。


  • thickness:轮廓线的宽度,如果为负数,则轮廓内部被填充。


  • lineType:线条类型,例如 cv2.LINE_8(8 连接的线)、cv2.LINE_AA(抗锯齿线)等,默认值是 cv2.LINE_8。


  • hierarchy:可选的轮廓层次信息。


  • maxLevel:绘制轮廓的最大层次。如果为 0,则只绘制指定的轮廓;如果为 1,则绘制指定轮廓及其直接子轮廓,依此类推。默认值为 0。


  • offset:可选的偏移量,用于移动轮廓的位置

示例代码:

im = cv2.imread("yy.png")#图片是一个五角星 im1=im.copy() im=cv2.cvtColor(im,cv2.COLOR_BGRA2GRAY)

计算轮廓

contours,=cv2.findContours(im,cv2.RETRTREE,cv2.CHAINAPPROXSIMPLE)


找4个点的坐标

box=cv2.minAreaRect(contours[0])#因为box是一个元组套一个列表,contours就是要把列表取出来 print(box) box=cv2.boxPoints(box) print(box)


把浮点型转为Int

box=np.intp(np.round(box))


画轮廓

cv2.drawContours(im,[box],-1,(255,0,255),1,cv2.LINE_AA) cv2.imshow('最小外界矩形',im) cv2.waitKey(0) cv2.destroyAllWindows()

边界矩形--(最大外接矩形)

·直角矩形(最大外接矩形):不考虑物体的旋转。所以直角矩形的面积不是最小的。它是由函数x,y,w,h=cv2.boundingRect()找到的。

·令(x,y)为矩形的左上角坐标,而(w,h)为矩形的宽度和高度。

import cv2 import numpy as np

im = cv2.imread("yy.png")

转灰度

im1=cv2.cvtColor(im,cv2.COLOR_BGRA2GRAY)


找轮廓

contours,=cv2.findContours(im1,cv2.RETRTREE,cv2.CHAINAPPROXNONE)


找顶点

x,y,w,h=cv2.boundingRect(contours[0])


画矩形

cv2.rectangle(im,(x,y),(x+w,y+h),(255,255,1),2,cv2.LINE_AA)


显示

cv2.imshow('im',im) cv2.waitKey(0) cv2.destroyAllWindows()

效果图:一上图一样

背景分离方法(这个很好玩,可以识别在动的物体)

bgsub=cv2.createBackgroundSubtractorMOG2():创建背景减除器实例,然后用bgsub.applay(img),再show一下bgsub就可以了。可以用来检测在动的物体

减除器实例.apply(image[, fgmask[, learningRate]]) -> fgmask:计算前景掩码和更新背景。如果要更改用于更新背景模型的学习率,可以通过将参数传递给apply方法来设置特定的学习率。learningRate该值位于0到1之间,表示背景模型被学习或更新的速度。负数的参数值使算法采用自动选择的学习率。0意味着背景模型完全不进行更新,保持初始状态;1则意味着背景模型在每一帧后都会根据新信息完全重新初始化。因此,此参数控制了背景模型适应场景变化的敏感度和速度。


视频中动态的物体就是前景


静态的物体就是背景


参数说明:

  • shape:表示结构元素的形状,可以是以下几种取值:
  • cv2.MORPH_RECT:矩形结构元素
  • cv2.MORPH_CROSS:十字形结构元素
  • cv2.MORPH_ELLIPSE:椭圆形结构元素
  • ksize:表示结构元素的大小
  • anchor:表示结构元素的锚点位置,默认为(-1,-1),表示结构元素的中心

代码演示:

"""
  视频中动态的物体就是 前景
        静态的物体就是背景
"""
 
import cv2
 
cap = cv2.VideoCapture(0)
 
# 创建背景减除器对象
bgsub = cv2.createBackgroundSubtractorMOG2()
 
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 将视频中的每一帧图像应用背景减除器,减除背景
    fgmask = bgsub.apply(frame)
    cv2.imshow("win", fgmask)
    if cv2.waitKey(25) == 27:
        cv2.destroyAllWindows()
        break


效果:过于离谱就不展示了,只要动的地方就会变白,视频哈


相关文章
|
1月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
WK
|
18天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
66 36
|
28天前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
62 2
11种经典时间序列预测方法:理论、Python实现与应用
|
24天前
|
开发者 Python
Python中的魔法方法与运算符重载
在Python的奇妙世界里,魔法方法(Magic Methods)和运算符重载(Operator Overloading)是两个强大的特性,它们允许开发者以更自然、更直观的方式操作对象。本文将深入探讨这些概念,并通过实例展示如何利用它们来增强代码的可读性和表达力。
|
1月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
164 16
|
1月前
|
Python
Python中的push方法详解与实例
Python中的push方法详解与实例
|
1月前
|
存储 Python
python列表操作和方法
python列表操作和方法
29 1
|
1月前
|
存储 索引 Python
反转Python列表的4种方法
反转Python列表的4种方法
|
1月前
|
Python
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
17 1
|
1月前
|
Linux Python
Python获得本机本地ip地址的方法
【10月更文挑战第8天】 socket模块包含了丰富的函数和方法,可以获取主机的ip地址,例如gethostbyname方法可以根据主机名获取ip地址,gethostbyname_ex方法可以获得本机所有ip地址列表,也可以使用netifaces模块获取网卡信息。
34 0