Как использовать OpenCV обнаружение сечения черного провода - PullRequest
0 голосов
/ 21 апреля 2020

Моя цель - убедиться, что на черном проводе есть какая-то лента. (лента с указанием c цвета Красный, желтый, синий)

Теперь я могу обнаружить ленту на проводе.
Но я понятия не имею, как обнаружить провод и проверить, что у него есть область пересечения.

enter image description here

Это мой код:

import numpy as np
import cv2

def load_image(path_img):
    return cv2.imread(path_img)

def bgr2hsv(img):
    return cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

def setRangeColor(hsv, lower_color, upper_color):
    return cv2.inRange(hsv, lower_color, upper_color)

def contours_img(mask):
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    return contours

def filter_contours_img(contours, img_draw, color_bbox):
    count = 0
    for c in contours:
        rect = cv2.boundingRect(c)
        x,y,w,h = rect
        area = w * h

        if area > 1000:
            count = count + 1
            cv2.rectangle(img_draw, (x, y), (x+w, y+h), color_bbox, 5)
    return img_draw, count

def draw_text_on_image(img_draw, count_yellow, count_red, count_blue):
    cv2.rectangle(img_draw, (0, 0), (500, 170), (0,0,0), -1)
    cv2.putText(img_draw,'Red Count : ' + str(count_red), 
    (10,50),                  # bottomLeftCornerOfText
    cv2.FONT_HERSHEY_SIMPLEX, # font 
    1.5,                      # fontScale
    (0,255,255),            # fontColor
    2)                        # lineType

cv2.putText(img_draw,'Yellow Count : ' + str(count_yellow), 
    (10,100),                  # bottomLeftCornerOfText
    cv2.FONT_HERSHEY_SIMPLEX, # font 
    1.5,                      # fontScale
    (0,255,255),            # fontColor
    2)                        # lineType

cv2.putText(img_draw,'blue Count : ' + str(count_blue), 
    (10,150),                  # bottomLeftCornerOfText
    cv2.FONT_HERSHEY_SIMPLEX, # font 
    1.5,                      # fontScale
    (0,255,255),            # fontColor
    2)                        # lineType
return img_draw

def main():
    path_img = 'images/ph14.jpg'
    img = load_image(path_img)
    #cv2.imshow('img_title',img)
    #img = cv2.resize(img, None,fx=0.5,fy=0.5)
    hsv = bgr2hsv(img)
    img_draw = img

    # define range of Yellow color in HSV
    lower_Yellow = np.array([20,100,100])
    upper_Yellow = np.array([30,255,255])
    mask = setRangeColor(hsv, lower_Yellow, upper_Yellow)
    contours = contours_img(mask)
    color_bbox = (0, 255, 0)
    img_draw, count_yellow = filter_contours_img(contours, img_draw, color_bbox)
    print('Yellow Count:', count_yellow)

    # define range of Red color in HSV
    lower_Red = np.array([0,125,125])
    upper_Red = np.array([10,255,255])
    mask0 = setRangeColor(hsv, lower_Red, upper_Red)
    contours = contours_img(mask0)
    color_bbox = (0, 125, 255)
    img_draw, count_red0 = filter_contours_img(contours, img_draw, color_bbox)
    #print('Red Count:', count_red)
    # upper mask (170-180)
    lower_red = np.array([170,100,100]) #170
    upper_red = np.array([180,255,255]) #180
    mask1 = cv2.inRange(hsv, lower_red, upper_red)
    contours = contours_img(mask1)
    color_bbox = (0, 125, 255)
    img_draw, count_red1 = filter_contours_img(contours, img_draw, color_bbox)
    count_red = count_red0 + count_red1
    print('Red Count:', count_red)

    # define range of Blue color in HSV
    lower_Blue = np.array([100,125,125])
    upper_Blue = np.array([125,255,255])
    mask = setRangeColor(hsv, lower_Blue, upper_Blue)
    contours = contours_img(mask)
    color_bbox = (255, 0, 255)
    img_draw, count_blue = filter_contours_img(contours, img_draw, color_bbox)

    img_draw = draw_text_on_image(img_draw, count_yellow, count_red, count_blue)
    print('Blue Count:', count_blue)

    cv2.imwrite('output/output_IMG_ph14.png', img_draw)

if __name__ == '__main__':
    main()

Я думаю, что мой окончательный результат может показать результат, как показано ниже. (Зеленая цветная линия не обязательна.)

enter image description here

Это более детализированное изображение ** (красное обнаружено более 1) в этом случае ** я думаю, что если я смогу обнаружить черный провод , я смогу проверить правильность обнаружения.

введите описание изображения здесь

...