简单的物体(圆形)检测与追踪
总的是用颜色来充当减少噪音的主要因素,其中均值滤波和开、闭运算是为了减少反光而做的一种测试,不多说直接代码:
import numpy as np
import cv2
src = cv2.imread('ball.JPG')
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV) # 转换为HSV空间
# 设置阈值,作用和对颜色进行限制差不多,但是没有下面对颜色限制精确
(_, mask) = cv2.threshold(hsv, 35, 255, cv2.THRESH_BINARY)
# 设定绿色的阈值下限,设定绿色的阈值上限,消除噪声,设定掩膜取值范围,是为了把hsv空间不属于阈值范围的颜色消除
#lower_green = np.array([25, 40, 100])
#upper_green = np.array([77, 255, 255])
#mask = cv2.inRange(hsv, lower_green, upper_green)
#核数可改
#cv2.blur()均值滤波
blurred = cv2.blur(mask, (9, 9))
#中值滤波
# blurred=cv2.medianBlur(mask,7)
#高斯滤波
# blurred=cv2.GaussianBlur(mask,(7,7),0,0)
#方框滤波
# blurred=cv2.boxFilter(mask,-1,(14,14),normalize=False)
kernel = np.ones((9,9),np.uint8)
#cv2.MORPH_CLOSE 闭运算,先膨胀在腐蚀 cv2.MORPH_OPEN开运算,先腐蚀在膨胀
opening = cv2.morphologyEx(blurred, cv2.MORPH_CLOSE, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_OPEN, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_CROSS, kernel) # 形态学开运算
# opening = cv2.morphologyEx(opening, cv2.MORPH_OPEN, kernel) # 形态学开运算
#双边滤波
bila = cv2.bilateralFilter(opening, 8, 350, 350) # 双边滤波消除噪声
#轮廓检测
edges = cv2.Canny(opening, 35, 20)
#霍夫圆检测
circles = cv2.HoughCircles(
edges, cv2.HOUGH_GRADIENT, 1, 1000, param1=90, param2=10, minRadius=1, maxRadius=50)
if circles is not None:
for circle in circles[0]:
# 获取圆的坐标与半径
x = int(circle[0])
y = int(circle[1])
r = int(circle[2])
cv2.circle(src, (x, y), r, (0, 0, 0), 5) # 标记圆
cv2.circle(src, (x, y), 4, (155,155, 155), 2) # 标记圆心
cv2.putText(src, None, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 1, cv2.LINE_AA, 0) # 显示圆心位置
#,'erosion',erosion,'thresh',thresh
titles=['src','hsv','mask','blurred','opening','bila','edges']
images=[src,hsv,mask,blurred,opening,bila,edges]
plt.figure(figsize=(40,40))
for i in range(7):
plt.subplot(4,4,i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()