您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么用opencv判斷多種顏色小球的形狀及位置的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么用opencv判斷多種顏色小球的形狀及位置文章都會有所收獲,下面我們一起來看看吧。
OpenCV是一個用于圖像處理、分析、機器視覺方面的開源函數庫.
代碼如下:
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 = {}
字典xz是待會記錄形狀用的
代碼如下:
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()
代碼如下:
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)#繪制圓形輪廓
代碼如下:
#獲取圖像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
#獲取圖像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判斷多種顏色小球的形狀及位置”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。