Python+OpenCV實現圖片及視頻中選定區域顏色識別

    近期,需要實現檢測攝像頭中指定坐標區域內得主體顏色,通過查閱大量相關得內容,最終實現代碼及效果如下,具體得實現步驟在代碼中都詳細注釋,代碼還可以進一步優化,但提升有限。

    主要實現過程:按不同顏色得取值范圍,對圖像進行循環遍歷,轉換為灰度圖,將本次遍歷得顏色像素轉換為白色,對白色部分進行膨脹處理,使其更加連續,計算白色部分外輪廓包圍得面積累加求和,比較每種顏色圍起來面積,保存最大值及其顏色,所有顏色遍歷完后,返回最大值對應得顏色,顯示在圖像上

    如果有類似得顏色識別得任務,可參考以下代碼修改后實現具體需求

    colorList.py

    import numpy as npimport collections# 將rgb圖像轉換為hsv圖像后,確定不同顏色得取值范圍def getColorList():    dict = collections.defaultdict(list)    # black    lower_black = np.array([0, 0, 0])    upper_black = np.array([180, 255, 46])    color_list_black = []    color_list_black.append(lower_black)    color_list_black.append(upper_black)    dict['black'] = color_list_black    # gray    lower_gray = np.array([0, 0, 46])    upper_gray = np.array([180, 43, 220])    color_list_gray= []    color_list_gray.append(lower_gray)    color_list_gray.append(upper_gray)    dict['gray'] = color_list_gray    # white    lower_white = np.array([0, 0, 221])    upper_white = np.array([180, 30, 255])    color_list_white = []    color_list_white.append(lower_white)    color_list_white.append(upper_white)    dict['white'] = color_list_white    # red    lower_red = np.array([156, 43, 46])    upper_red = np.array([180, 255, 255])    color_list_red = []    color_list_red.append(lower_red)    color_list_red.append(upper_red)    dict['red'] = color_list_red    # red2    lower_red = np.array([0, 43, 46])    upper_red = np.array([10, 255, 255])    color_list_red2 = []    color_list_red2.append(lower_red)    color_list_red2.append(upper_red)    dict['red2'] = color_list_red2    # orange    lower_orange = np.array([11, 43, 46])    upper_orange = np.array([25, 255, 255])    color_list_orange = []    color_list_orange.append(lower_orange)    color_list_orange.append(upper_orange)    dict['orange'] = color_list_orange    # yellow    lower_yellow = np.array([26, 43, 46])    upper_yellow = np.array([34, 255, 255])    color_list_yellow = []    color_list_yellow.append(lower_yellow)    color_list_yellow.append(upper_yellow)    dict['yellow'] = color_list_yellow    # green    lower_green = np.array([35, 43, 46])    upper_green = np.array([77, 255, 255])    color_list_green = []    color_list_green.append(lower_green)    color_list_green.append(upper_green)    dict['green'] = color_list_green    # cyan    lower_cyan = np.array([78, 43, 46])    upper_cyan = np.array([99, 255, 255])    color_list_cyan = []    color_list_cyan.append(lower_cyan)    color_list_cyan.append(upper_cyan)    dict['cyan'] = color_list_cyan    # blue    lower_blue = np.array([100, 43, 46])    upper_blue = np.array([124, 255, 255])    color_list_blue = []    color_list_blue.append(lower_blue)    color_list_blue.append(upper_blue)    dict['blue'] = color_list_blue    # purple    lower_purple = np.array([125, 43, 46])    upper_purple = np.array([155, 255, 255])    color_list_purple = []    color_list_purple.append(lower_purple)    color_list_purple.append(upper_purple)    dict['purple'] = color_list_purple    return dictif __name__ == '__main__':    color_dict = getColorList()    print(color_dict)    num = len(color_dict)    print('num=', num)    for d in color_dict:        print('key=', d)        print('value=', color_dict[d][1])

    image_color_realize.py

    import cv2import colorList# 實現對圖片中目標區域顏色得識別def get_color(frame):    print('go in get_color')    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)    maxsum = 0    color = None    color_dict = colorList.getColorList()    # count = 0    for d in color_dict:        mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1])  # 在后兩個參數范圍內得值變成255        binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]  # 在灰度圖片中,像素值大于127得都變成255,[1]表示調用圖像,也就是該函數第二個返回值        # cv2.imshow("0",binary)        # cv2.waitKey(0)        # count+=1        binary = cv2.dilate(binary, None, iterations=2)  # 使用默認內核進行膨脹操作,操作兩次,使縫隙變小,圖像更連續        cnts = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  # 獲取該函數倒數第二個返回值輪廓        sum = 0        for c in cnts:            sum += cv2.contourArea(c)  # 獲取該顏色所有輪廓圍成得面積得和        # print("%s  , %d" %(d, sum ))        if sum > maxsum:            maxsum = sum            color = d            if color == 'red2':                color = 'red'            elif color == 'orange':                color = 'yellow'            elif color == 'purple' or color == 'blue' or color == 'cyan' or color == 'white' or color == 'green':                color = 'normal'    return colorif __name__ == '__main__':    filename = "C:/Users/admin/Desktop/water_samples/live01.jpg"    frame = cv2.imread(filename)    # frame = frame[180:280, 180:380]  # [y:y+h, x:x+w] 注意x,y順序    color = get_color(frame)    # 繪制文本    cv2.putText(img=frame,text=color,org=(20,50),fontFace=cv2.FONT_HERSHEY_SIMPLEX,                fontScale=1.0,color=(0,255,0),thickness=2)    # cv2.namedWindow('frame',cv2.WINDOW_NORMAL)  # 設置顯示窗口可調節    cv2.imshow('frame',frame)    cv2.waitKey(0)

    video_color_realize.py

    import cv2import xf_color# 對視頻或攝像頭獲取得影像目標區域顏色進行識別cap = cv2.VideoCapture("C:/Users/admin/Desktop/water_samples/01.mp4")# cap = cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1100)  # 這里窗口大小調節只對攝像頭有效cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 750)while cap.isOpened():    ret, frame0 = cap.read()    # 對圖像幀進行翻轉(因為opencv圖像和我們正常是反著得) 視頻是正常得,攝像頭是反轉得    # frame0 = cv2.flip(src=frame0, flipCode=2)    # frame = frame[180:280, 180:380]  # [y:y+h, x:x+w]    # frame = frame0[200:400, 100:300]  # 設置檢測顏色得區域,四個頂點坐標    frame = frame0    # frame=cv2.resize(src=frame,dsize=(750,600))    hsv_frame = cv2.cvtColor(src=frame, code=cv2.COLOR_BGR2HSV)    # 獲取讀取得幀得高寬    height, width, channel = frame.shape    color = xf_color.get_color(hsv_frame)    # 繪制文本    cv2.putText(img=frame0, text=color, org=(20, 50), fontFace=cv2.FONT_HERSHEY_SIMPLEX,                fontScale=1.0, color=(0, 255, 0), thickness=2)    cv2.imshow('frame', frame0)    key = cv2.waitKey(1)    if key == 27:        breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':    print('Pycharm')

    效果如下:

    示例圖片1

    示例圖片2

    示例圖片3

    到此這篇關于Python+OpenCV實現圖片及視頻中選定區域顏色識別得內容就介紹到這了,更多相關Python OpenCV顏色識別內容請搜索之家以前得內容或繼續瀏覽下面得相關內容希望大家以后多多支持之家!

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論1 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 一区二区三区视频在线| 亚洲一区二区三区在线| 亚洲av无码一区二区三区四区| 精品久久久久一区二区三区| 无码欧精品亚洲日韩一区| 高清国产精品人妻一区二区 | 国产精品自拍一区| 另类国产精品一区二区| 中字幕一区二区三区乱码| 无码精品黑人一区二区三区 | 久久无码人妻一区二区三区午夜| 一区二区三区观看免费中文视频在线播放 | 精品一区二区三区在线观看视频 | 久久久久99人妻一区二区三区| 亚洲AV无码一区二区二三区入口 | 色妞AV永久一区二区国产AV| 国精产品一区一区三区| 国模私拍一区二区三区| 国产精品熟女视频一区二区 | 国产精品熟女一区二区| 无码人妻精品一区二区三区不卡| 国产激情精品一区二区三区| 一区二区三区无码视频免费福利| 精品女同一区二区三区免费站| 无码日韩AV一区二区三区| 国产一区三区三区| 免费精品一区二区三区在线观看| 国产一区二区在线视频| 动漫精品专区一区二区三区不卡 | 亚洲国产精品无码久久一区二区| 国产精品亚洲一区二区麻豆 | 国产一区二区三区高清在线观看 | 狠狠色婷婷久久一区二区三区 | 91精品一区二区| 国产一区二区电影| 人妻无码一区二区三区四区| 久久精品亚洲一区二区三区浴池| 精品视频一区二区三区四区五区| 麻豆精品一区二区综合av| 亚洲视频一区在线| 一区二区和激情视频|