Opencv+python extracts objects of a certain color in the picture


Description: This is the program in the 3h learning opencv video tutorial on the reproduced Internet for learning.

1. Call library functions

import cv2
import numpy as np

2. Callback subroutine of cv2.creatTrackbar() function

def empty(a):
    pass

This callback function is generally in a fixed format.
Calling method for example: cv2.createTrackbar("Hue Min","TrackBars", 0, 179, empty )

3. Picture arrangement display pictures

It is used to compare the different processing methods. The first parameter is the zoom ratio between 0 and 1; the second parameter is the matrix formed by the image arrangement.
Calling method for example: imgStacked = stackImages(0.6, ([img, imgHSV], [mask, imgResult]))

def stackImages(scale,imgArray):
    rows = len(imgArray)
    cols = len(imgArray[0])
    rowsAvailable = isinstance(imgArray[0], list) # 判断是否是列表形式,若是则回True
    width = imgArray[0][0].shape[1]
    height = imgArray[0][0].shape[0]
    if rowsAvailable:
        for x in range(0, rows):
            for y in range(0, cols):
                if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                else:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
                if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
        imageBlank = np.zeros((height, width, 3), np.uint8)
        hor = [imageBlank]*rows
        hor_con = [imageBlank]*rows
        for x in range(0, rows):
            hor[x] = np.hstack(imgArray[x])
        ver = np.vstack(hor)
    else:
        for x in range(0, rows):
            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
            else:
                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
            if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
        hor= np.hstack(imgArray)
        ver = hor	#返回的是图像,只需要调用imshow()函数正常显示即可。
    return ver

4. Create Tracking Bar

  1. Generally, hsv color space is used to select colors, because hsv space is more capable of distinguishing different colors than rgb space, making it easier to select colors. hsv are: hue, saturation and brightness.
  2. Here you can change the hsv value through the tracking bar to select the desired color in the picture.
  3. The range of hue is generally 0~180, and the other two are 0~255.
path = "resource/car4.jpg"
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,340)
# 创建跟踪栏
cv2.createTrackbar("Hue Min","TrackBars", 0, 179, empty)   #色调
cv2.createTrackbar("Hue Max","TrackBars", 179, 179, empty)
cv2.createTrackbar("Sat Min","TrackBars", 0, 255, empty)   #饱和度
cv2.createTrackbar("Sat Max","TrackBars", 255, 255, empty)
cv2.createTrackbar("Val Min","TrackBars", 0, 255, empty)  #亮度,用HSV空间更能体现人眼对不同颜色的差别
cv2.createTrackbar("Val Max","TrackBars", 255, 255, empty)

5. Main program

First read out the picture and convert it to a grayscale picture, then get the value of the tracking bar, then set the threshold according to the obtained hsv value to remove the background part,
and then perform the AND operation on the picture with the original picture to remove the background, and then pass the previous The stackImages function is displayed.

while True:
    img = cv2.imread(path)
    imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)        # 转换为HSV空间
    h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    print(h_min,h_max,s_min,s_max,v_min,v_max)

    lower = np.array([h_min,s_min,v_min])
    upper = np.array([h_max,s_max,v_max])
    mask = cv2.inRange(imgHSV,lower,upper)
    imgResult = cv2.bitwise_and(img,img,mask=mask)
    imgStacked = stackImages(0.6, ([img, imgHSV], [mask, imgResult]))
    cv2.imshow("Stacked images", imgStacked)
    cv2.waitKey(1)

6. Test results

Tracking bar:

Color selection results & picture display:

Guess you like

Origin blog.csdn.net/weixin_45371989/article/details/106903701