1. 阈值调整,交互式的阈值调整,确定上限和下限:
import cv2 as cv
import numpy as np
def Tcallback(event):
H = cv.getTrackbarPos('H', 'show_pic')
S = cv.getTrackbarPos('S', 'show_pic')
V = cv.getTrackbarPos('V', 'show_pic')
H0 = cv.getTrackbarPos('H0', 'show_pic')
S0 = cv.getTrackbarPos('S0', 'show_pic')
V0 = cv.getTrackbarPos('V0', 'show_pic')
lower_red = np.array([H0, S0, V0])
upper_red = np.array([H, S, V])
mask = cv.inRange(hsv, lower_red, upper_red)
res = cv.bitwise_and(img, img, mask=mask)
cv.imshow('show_pic', res)
img = cv.imread('sam2.png')#, 1)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV_FULL)
cv.namedWindow('show_pic')
cv.resizeWindow('show_pic', 640, 480)
cv.createTrackbar('H', 'show_pic', 255, 255, Tcallback)
cv.createTrackbar('S', 'show_pic', 255, 255, Tcallback)
cv.createTrackbar('V', 'show_pic', 255, 255, Tcallback)
cv.createTrackbar('H0', 'show_pic', 0, 255, Tcallback)
cv.createTrackbar('S0', 'show_pic', 43, 255, Tcallback)
cv.createTrackbar('V0', 'show_pic', 46, 255, Tcallback)
if cv.waitKey(0) == ord('q'):
cv.destroyAllWindows()
2. 阈值分割,并找到最大轮廓
现根据mask找到所有轮廓
对所有轮廓排序,找到最大的
再对最大轮廓去凸多边形,用来对噪声做过滤。
img=cv2.resize(img,(640,480))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)
mask_green=cv2.inRange(hsv, self.lower_green, self.upper_green)
img_c,contours, hierarchy = cv2.findContours(mask_green,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
list_c=sorted(contours,key=cv2.contourArea,reverse=True)
c_max=list_c[0]
approx = cv2.approxPolyDP(c_max, 0.01 * cv2.arcLength(c_max, True), True)
hull = cv2.convexHull(c_max)