opencv對(duì)多種顏色小球的形狀及位置判斷方式
一、opencv是什么?
OpenCV是一個(gè)用于圖像處理、分析、機(jī)器視覺(jué)方面的開(kāi)源函數(shù)庫(kù).
二、使用步驟
1.引入庫(kù)
代碼如下:
import cv2 import numpy as np
2.設(shè)置顏色閾值
代碼如下:
#顏色閾值 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是待會(huì)記錄形狀用的
3.對(duì)圖片進(jìn)行加載和處理
代碼如下:
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)#處理圖片的函數(shù) cv2.imshow('image', image) cv2.waitKey(0) cv2.destroyAllWindows()
4.處理圖片的函數(shù)
代碼如下:
def color_read(hsv, image): global xz blue = get_image(hsv, low_blue, up_blue)#使用獲取顏色空間的函數(shù)進(jìn)行顏色獲取三種顏色 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)) ##先判斷形狀再畫(huà)輪廓 for cnt in cnts: area = cv2.contourArea(cnt)#計(jì)算輪廓的面積 print('area:', area) if area > 1000: epsilon = 0.04 * cv2.arcLength(cnt, True)#計(jì)算輪廓長(zhǎng)度 approx = cv2.approxPolyDP(cnt, epsilon, True)#計(jì)算輪廓角點(diǎn) corners = len(approx) print(corners) #根據(jù)角點(diǎn)的個(gè)數(shù)判斷形狀 if corners == 3: a = '三角形' b = approx[0][0][0] # 根據(jù)三角形的角點(diǎn)判斷位置 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: #圓形這里是處理的不好的地方所以我沒(méi)有用變量x1和z,因?yàn)楫?huà)出來(lái)的輪廓有點(diǎn)大 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.獲取顏色空間函數(shù)
代碼如下:
#獲取圖像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.運(yùn)行效果
圖片之前拍的不是很好所以我截成了小圖,圖片拍的是幾何圖所以效果不太好,如果是平面的可能會(huì)好一點(diǎn),圖二是打印字典xz的輸出。
7.完整代碼
#獲取圖像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)#使用獲取顏色空間的函數(shù)進(jìn)行顏色獲取三種顏色 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)) ##先判斷形狀再畫(huà)輪廓 for cnt in cnts: area = cv2.contourArea(cnt)#計(jì)算輪廓的面積 print('area:', area) if area > 1000: epsilon = 0.04 * cv2.arcLength(cnt, True)#計(jì)算輪廓長(zhǎng)度 approx = cv2.approxPolyDP(cnt, epsilon, True)#計(jì)算輪廓角點(diǎn) corners = len(approx) print(corners) #根據(jù)角點(diǎn)的個(gè)數(shù)判斷形狀 if corners == 3: a = '三角形' b = approx[0][0][0] # 根據(jù)三角形的角點(diǎn)判斷位置 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)#處理圖片的函數(shù) cv2.imshow('image', image) cv2.waitKey(0) cv2.destroyAllWindows() #對(duì)拿到的小球字典位置數(shù)據(jù)進(jìn)行處理 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)
總結(jié)
這是這個(gè)代碼的詳細(xì)和功能介紹,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)針對(duì)給定字符串尋找最長(zhǎng)非重復(fù)子串的方法
這篇文章主要介紹了Python實(shí)現(xiàn)針對(duì)給定字符串尋找最長(zhǎng)非重復(fù)子串的方法,涉及Python針對(duì)字符串的遍歷、排序、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn)
今天小編就為大家分享一篇tensorflow 重置/清除計(jì)算圖的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01pip版本低引發(fā)的python離線包安裝失敗的問(wèn)題
這篇文章主要介紹了pip版本低引發(fā)的python離線包安裝失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python3實(shí)現(xiàn)UDP協(xié)議的服務(wù)器和客戶(hù)端
這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)UDP協(xié)議的服務(wù)器和客戶(hù)端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Python與C語(yǔ)言分別解決完全平方數(shù)問(wèn)題
完全平方數(shù)指用一個(gè)整數(shù)乘以自己例如1*1.2*2.3*3等依次類(lèi)推,若一個(gè)數(shù)能表示成某個(gè)整數(shù)的平方的形式,則稱(chēng)這個(gè)數(shù)為完全平方數(shù)。完全平方數(shù)是非負(fù)數(shù),而一個(gè)完全平方數(shù)的項(xiàng)有倆個(gè),讓我們用程序來(lái)練習(xí)一下2022-03-03Python+Pygame編寫(xiě)一個(gè)Pong游戲
Pong游戲模擬了兩個(gè)打乒乓球的人,就是在兩條線中間有一個(gè)點(diǎn)在動(dòng),操縱器就是一個(gè)搖桿上有一個(gè)按鈕的那種。本文就來(lái)用Python中的Pygame庫(kù)編寫(xiě)一個(gè)Pong小游戲2023-01-01升級(jí)keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問(wèn)題
這篇文章主要介紹了升級(jí)keras解決load_weights()中的未定義skip_mismatch關(guān)鍵字問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06