简介
在做跟踪匹配的时候,由于目标的形状不能保持,有可能会存在上下两帧目标图像形状不能一直保持矩形的情况,因此没有利用形状信息进行目标跟踪。但是又不想浪费形状信息,因此利用矩形度特征进行加权。
从网上查找没有找到类似的程序,只看到了矩形度的概念。在此补充程序(python版)。
1.矩形度概念
矩形度体现物体对其外接矩形的充满程度,反映一个物体与矩形相似程度的一个参数,是矩形拟合因子。其计算公式为:
R
=
S
0
/
S
M
E
R
R =S_0 / S_{MER}
R=S0/SMER
其中, S 0 S_0 S0 是该物体的面积,而 S M E R S_{MER} SMER 是其最小外接矩形的面积。 R R R 反映了一个物体对其的充满程度。对于矩形物体 R R R取得最大值1,对于圆形物体 R R R 取值为 ,对于纤细、弯曲的物体 R R R取值变小。矩形拟合因子的值为 0 − 1 0-1 0−1.
源自:
https://blog.csdn.net/mao_hui_fei/article/details/80395294
2. 程序
计算矩形度程序如下:
import cv2
import numpy as np
def Cal_Rectangle_degree(img_ori, hull):
# 计算该坐标点组成的四边形的面积
im = np.zeros(img_ori.shape[:2], dtype="uint8")
filling_image = np.array([hull[0][0],hull[1][0],hull[2][0],hull[3][0]], np.int32)
polygon_mask = cv2.fillPoly(im, [filling_image], 255)
measure_polygon = np.sum(np.greater(polygon_mask, 0))
# 计算该坐标点组成的四边形的外接矩形面积
rect = cv2.minAreaRect(hull) # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
box = cv2.boxPoints(rect) # 获取最小外接矩形的4个顶点坐标(ps: cv2.boxPoints(rect) for OpenCV 3.x)
box = np.int0(box)
box = cv2.convexHull(box,clockwise=True)
filling_image = np.array([box[0][0],box[1][0],box[2][0],box[3][0]], np.int32)
rectangle_mask = cv2.fillPoly(im, [filling_image], 255)
measure_rectangle = np.sum(np.greater(rectangle_mask, 0))
# 计算矩形度
Rectangle_degree = measure_polygon/measure_rectangle
return Rectangle_degree
img_ori = *** # 源图像
hull = *** # hull为凸包顶点坐标:n*1*2(n为坐标点的个数)
Rectangle_degree = Cal_Rectangle_degree(img_ori, hull) # 矩形度指标
计算完矩形度后,将矩形度作为特征值,对预估和检测的结果进行加权,得到最终的位置。