目录
边界矩形
旋转矩形(最小外接矩形):
计算轮廓
找4个点的坐标
把浮点型转为Int
画轮廓
边界矩形--(最大外接矩形)
转灰度
找轮廓
找顶点
画矩形
显示
背景分离方法(这个很好玩,可以识别在动的物体)
边界矩形
有两种类型的边界矩形:
旋转矩形(最小外接矩形):
是用最小面积绘制的,所以它也考虑了旋转。使用的函数是cv.minAreaRect()。它返回一个Box2D结构,其中包含以下细节-(中心(x,y),(宽度,高度),旋转角度)。但要画出这个矩形,我们需要矩形的四个角。它由函数cv.boxPoints()获得
cv.minAreaRect()函数返回一个包含以下信息的 RotatedRect
对象:
-
center
:矩形的中心坐标((x, y)
)。 -
size
:矩形的尺寸((width, height)
)。 -
angle
:矩形的旋转角度,取值范围为-90
到0
度。
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
效果:过于离谱就不展示了,只要动的地方就会变白,视频哈