opencv對多種顏色小球的形狀及位置判斷方式
一、opencv是什么?
OpenCV是一個(gè)用于圖像處理、分析、機(jī)器視覺方面的開源函數(shù)庫.
二、使用步驟
1.引入庫
代碼如下:
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.對圖片進(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))
##先判斷形狀再畫輪廓
for cnt in cnts:
area = cv2.contourArea(cnt)#計(jì)算輪廓的面積
print('area:', area)
if area > 1000:
epsilon = 0.04 * cv2.arcLength(cnt, True)#計(jì)算輪廓長度
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:
#圓形這里是處理的不好的地方所以我沒有用變量x1和z,因?yàn)楫嫵鰜淼妮喞悬c(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 mask6.運(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))
##先判斷形狀再畫輪廓
for cnt in cnts:
area = cv2.contourArea(cnt)#計(jì)算輪廓的面積
print('area:', area)
if area > 1000:
epsilon = 0.04 * cv2.arcLength(cnt, True)#計(jì)算輪廓長度
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()
#對拿到的小球字典位置數(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的mysql數(shù)據(jù)庫建立表與插入數(shù)據(jù)操作示例
這篇文章主要介紹了python的mysql數(shù)據(jù)庫建立表與插入數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了python操作mysql數(shù)據(jù)庫建立表與插入數(shù)據(jù)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-09-09
Python ORM框架SQLAlchemy學(xué)習(xí)筆記之映射類使用實(shí)例和Session會(huì)話介紹
這篇文章主要介紹了Python ORM框架SQLAlchemy學(xué)習(xí)筆記之映射類使用實(shí)例和Session會(huì)話介紹,需要的朋友可以參考下2014-06-06
實(shí)例詳解Matlab 與 Python 的區(qū)別
Python是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語言。這篇文章主要介紹了Matlab 與 Python 的區(qū)別及優(yōu)勢,感興趣的朋友跟隨小編一起看看吧2019-04-04
解決Django migrate不能發(fā)現(xiàn)app.models的表問題
今天小編就為大家分享一篇解決Django migrate不能發(fā)現(xiàn)app.models的表問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python 處理數(shù)字,把大于上限的數(shù)字置零實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 處理數(shù)字,把大于上限的數(shù)字置零實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01

