中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用opencv判斷多種顏色小球的形狀及位置

發布時間:2022-11-11 09:21:24 來源:億速云 閱讀:95 作者:iii 欄目:開發技術

這篇文章主要介紹了怎么用opencv判斷多種顏色小球的形狀及位置的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么用opencv判斷多種顏色小球的形狀及位置文章都會有所收獲,下面我們一起來看看吧。

    一、opencv是什么?

    OpenCV是一個用于圖像處理、分析、機器視覺方面的開源函數庫.

    二、使用步驟

    1.引入庫

    代碼如下:

    import cv2
    import numpy as np

    2.設置顏色閾值

    代碼如下:

    #顏色閾值
    low_red = np.array([100, 100, 60])
    up_red = np.array([180, 255, 255])
    low_green = np.array([35, 43, 46])
    up_green = np.array([77, 255, 255])
    low_blue = np.array([90, 110, 110])
    up_blue = np.array([124, 255, 255])
    #記錄形狀
    xz = {}

    字典xz是待會記錄形狀用的

    3.對圖片進行加載和處理

    代碼如下:

    if __name__ == '__main__':
        image = cv2.imread('img_1.png')#讀取圖像
        image = cv2.resize(image, (500, 500))#重新裁剪圖像
        #image = cv2.GaussianBlur(image, (11, 11), 0)#高斯濾波
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        color_read(hsv, image)#處理圖片的函數
        cv2.imshow('image', image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    4.處理圖片的函數

    代碼如下:

    def color_read(hsv, image):
        global xz
        blue = get_image(hsv, low_blue, up_blue)#使用獲取顏色空間的函數進行顏色獲取三種顏色
        red = get_image(hsv, low_red, up_red)
        green = get_image(hsv, low_green, up_green)
        mask = blue + red + green
        #尋找圖像的輪廓
        cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        print('cnts:', len(cnts))
        ##先判斷形狀再畫輪廓
        for cnt in cnts:
            area = cv2.contourArea(cnt)#計算輪廓的面積
            print('area:', area)
            if area > 1000:
                epsilon = 0.04 * cv2.arcLength(cnt, True)#計算輪廓長度
                approx = cv2.approxPolyDP(cnt, epsilon, True)#計算輪廓角點
                corners = len(approx)
                print(corners)
                #根據角點的個數判斷形狀
                if corners == 3:
                    a = '三角形'
                    b = approx[0][0][0]  # 根據三角形的角點判斷位置
                    xz[a] = b
                    area, trgl = cv2.minEnclosingTriangle(cnt)#尋找三角形的輪廓
                    # 繪制三角形輪廓
                    for i in range(0, 3):
                        cv2.line(image, tuple(trgl[i][0]), tuple(trgl[(i + 1) % 3][0]), (0, 255, 0), 2)
                elif corners == 4:
                    a = '矩形'
                    b = approx[0][0][0]
                    xz[a] = b
                    x, y, w, h = cv2.boundingRect(cnt)#尋找矩形輪廓
                    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)#繪制矩形輪廓
                    
                else:
                	#圓形這里是處理的不好的地方所以我沒有用變量x1和z,因為畫出來的輪廓有點大
                    a = '圓'
                    b = approx[0][0][0]
                    xz[a] = b
                    ((x1, y1), z) = cv2.minEnclosingCircle(cnt)#尋找圓形輪廓
                    x1 = int(x1)
                    y1 = int(y1)
                    z = int(z)
                    cv2.circle(image, (150, y1), 60, (0, 255, 0), 2)#繪制圓形輪廓

    5.獲取顏色空間函數

    代碼如下:

    #獲取圖像hsv的方法
    def get_image(hsv, low, up):
        mask = cv2.inRange(hsv, low, up)#獲取色彩空間
        mask = cv2.erode(mask, None, 2)#腐蝕操作
        mask = cv2.dilate(mask, None, 2)#膨脹操作
        return mask

    6.完整代碼

    #獲取圖像hsv的方法
    import cv2
    import numpy as np
    #顏色閾值
    low_red = np.array([100, 100, 60])
    up_red = np.array([180, 255, 255])
    low_green = np.array([35, 43, 46])
    up_green = np.array([77, 255, 255])
    low_blue = np.array([90, 110, 110])
    up_blue = np.array([124, 255, 255])
    #記錄形狀
    xz = {}
    
    #獲取圖像hsv的方法
    def get_image(hsv, low, up):
        mask = cv2.inRange(hsv, low, up)#獲取色彩空間
        mask = cv2.erode(mask, None, 2)#腐蝕操作
        mask = cv2.dilate(mask, None, 2)#膨脹操作
        return mask
    
    #獲取輪廓
    def color_read(hsv, image):
        global xz
        blue = get_image(hsv, low_blue, up_blue)#使用獲取顏色空間的函數進行顏色獲取三種顏色
        red = get_image(hsv, low_red, up_red)
        green = get_image(hsv, low_green, up_green)
        mask = blue + red + green
        #尋找圖像的輪廓
        cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        print('cnts:', len(cnts))
        ##先判斷形狀再畫輪廓
        for cnt in cnts:
            area = cv2.contourArea(cnt)#計算輪廓的面積
            print('area:', area)
            if area > 1000:
                epsilon = 0.04 * cv2.arcLength(cnt, True)#計算輪廓長度
                approx = cv2.approxPolyDP(cnt, epsilon, True)#計算輪廓角點
                corners = len(approx)
                print(corners)
                #根據角點的個數判斷形狀
                if corners == 3:
                    a = '三角形'
                    b = approx[0][0][0]  # 根據三角形的角點判斷位置
                    xz[a] = b
                    area, trgl = cv2.minEnclosingTriangle(cnt)#尋找三角形的輪廓
                    # 繪制三角形輪廓
                    for i in range(0, 3):
                        cv2.line(image, tuple(trgl[i][0]), tuple(trgl[(i + 1) % 3][0]), (0, 255, 0), 2)
                elif corners == 4:
                    a = '矩形'
                    b = approx[0][0][0]
                    xz[a] = b
                    x, y, w, h = cv2.boundingRect(cnt)#尋找矩形輪廓
                    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)#繪制矩形輪廓
    
                else:
                    a = '圓'
                    b = approx[0][0][0]
                    xz[a] = b
                    ((x1, y1), z) = cv2.minEnclosingCircle(cnt)#尋找圓形輪廓
                    x1 = int(x1)
                    y1 = int(y1)
                    z = int(z)
                    cv2.circle(image, (150, y1), 60, (0, 255, 0), 2)#繪制圓形輪廓
    
    
    if __name__ == '__main__':
        image = cv2.imread('img_1.png')#讀取圖像
        image = cv2.resize(image, (500, 500))#重新裁剪圖像
        #image = cv2.GaussianBlur(image, (11, 11), 0)#高斯濾波
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        color_read(hsv, image)#處理圖片的函數
        cv2.imshow('image', image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        #對拿到的小球字典位置數據進行處理
        xz[min(xz, key=xz.get)] = 1
        xz[max(xz, key=xz.get)] = 3
        xz[max(xz, key=xz.get)] = 2
        xz = sorted(xz.items(), key=lambda x: x[1], reverse=False)
        xz = dict(xz)
    
        print(xz)

    關于“怎么用opencv判斷多種顏色小球的形狀及位置”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“怎么用opencv判斷多種顏色小球的形狀及位置”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    塔城市| 怀安县| 印江| 邯郸县| 建平县| 鄂伦春自治旗| 昭苏县| 红河县| 高青县| 安丘市| 潍坊市| 甘孜| 祥云县| 铁岭市| 彝良县| 建湖县| 包头市| 兴山县| 西丰县| 开原市| 长沙市| 瓮安县| 尼勒克县| 茂名市| 资阳市| 靖边县| 涞水县| 浙江省| 灵宝市| 定陶县| 珠海市| 茶陵县| 灌云县| 铁岭市| 个旧市| 巨野县| 澳门| 双流县| 凭祥市| 林州市| 深水埗区|