Contour segmentation based on color, based on opencv and python

1. Threshold adjustment, interactive threshold adjustment, determining upper and lower limits:

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. Threshold segmentation and find the largest contour

Now find all contours according to mask

Sort all contours and find the largest

Then remove the convex polygon from the maximum contour to filter the noise.

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)

Guess you like

Origin blog.csdn.net/lianbus/article/details/132166887