OpenCV顏色識別一般要以下步驟:
1 顏色空間轉(zhuǎn)換,將BGR轉(zhuǎn)換為HSV,用色調(diào)區(qū)分顏色
2 按照閾值濾出所識別的顏色
3 消除噪點,平滑邊界
3 提取連續(xù)域,提取要識別的顏色
1 HSV
H:色調(diào),用角度度量,范圍0°到360°,從紅色開始逆時針方向計算。紅色為0°,紅綠藍間隔120°,互補色差180°。
S:飽和度,范圍0到1,代表光譜色占顏色比例。0時顏色只有灰度,1時顏色為純光譜色
V:明度,范圍0到1,代表顏色明亮程度。0為黑色,1為白色
腐蝕(erosion)和膨脹(dilation)
腐蝕和膨脹作用:
1 消除噪聲
2 分割獨立圖像元素
3 尋找極大值或極小值區(qū)域
膨脹:
將圖像和任意尋找內(nèi)涵進行卷積,提取覆蓋區(qū)域的最大像素值。這一操作會使亮區(qū)擴展
腐蝕:
和膨脹正好相反,提取覆蓋區(qū)域最下像素值1,這一操作讓亮區(qū)變細,暗區(qū)變大
提取連通域:
兩種像素鄰接關系會構(gòu)成連通域:4鄰接(上下左右),和8鄰接(包括對角線)
opencv里尋找連通域函數(shù)findContours()
·語法格式:
image,contours,hierarchy = cv2.findContours(image,mode,method)
式中返回值為:
·image: 與函數(shù)參數(shù)中的原始圖像image一致。
·contours: 返回的輪廓。
·hierarchy: 圖像的拓撲信息(輪廓層次)。
式中參數(shù)為:
·mode: 輪廓檢索模式。
·method: 輪廓的近似方法。
參數(shù)mode:
cv2.RETR_EXTERNAL 只檢測外輪廓
cv2.RETR_LIST檢測的輪廓不建立等級關系
cv2.RETR_CCOMP建立兩個等級的輪廓
cv2.RETR_TREE建立一個等級樹結(jié)構(gòu)的輪廓
參數(shù)method:
cv2.CHAIN_APPROX_NONE存儲所有的輪廓點
cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息
(具體算法實現(xiàn)可以去了解union-find算法)
顏色識別程序?qū)崿F(xiàn)
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
red_min = np.array([0, 128, 46])
red_max = np.array([5, 255, 255])
red2_min = np.array([156, 128, 46])
red2_max = np.array([180, 255, 255])
yellow_min = np.array([15, 128, 46])
yellow_max = np.array([50, 255, 255])
while True:
ret,frame = cap.read()
x,y = frame.shape[0:2]
small_frame = cv2.resize(frame, (int(y / 2), int(x / 2)))
cv2.imshow('small', small_frame)
src = small_frame.copy()
res = src.copy()
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
mask_red1 = cv2.inRange(hsv, red_min, red_max)
mask_red2 = cv2.inRange(hsv, red2_min, red2_max)
mask_yellow = cv2.inRange(hsv, yellow_min, yellow_max)
mask = cv2.bitwise_or(mask_red1, mask_red2)
mask = cv2.bitwise_or(mask, mask_yellow)
res = cv2.bitwise_and(src, src, mask=mask)
h, w = res.shape[:2]
blured = cv2.blur(res, (5, 5))
ret, bright = cv2.threshold(blured, 10, 255, cv2.THRESH_BINARY)
gray = cv2.cvtColor(bright, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
opened = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
contours, hierarchy = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(src, contours, -1, (255, 0, 0), 2)
cv2.imsow("result", src)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
1 red_min = np.array([0, 128, 46])
red_max = np.array([5, 255, 255])
red2_min = np.array([156, 128, 46])
red2_max = np.array([180, 255, 255])
yellow_min = np.array([15, 128, 46])
yellow_max = np.array([50, 255, 255])
我們要識別兩種紅色和一種黃色。這里列出它們的閾值上下限作為圖像二值化的取值范圍
2 hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
把圖像轉(zhuǎn)化為hsv類型
3 mask_red1 = cv2.inRange(hsv, red_min, red_max)
mask_red2 = cv2.inRange(hsv, red2_min, red2_max)
mask_yellow = cv2.inRange(hsv, yellow_min, yellow_max)
mask = cv2.bitwise_or(mask_red1, mask_red2)
mask = cv2.bitwise_or(mask, mask_yellow)
res = cv2.bitwise_and(src, src, mask=mask)
圖像二值化,提取滿足閾值范圍的像素
cv2.inRange(圖像,閾值下限,閾值上限):將閾值范圍內(nèi)像素設為255,閾值之外像素設為0
cv2.bitwise_or(圖像1,圖像2):圖像或運算實現(xiàn)疊加
cv2.bitwise_and(圖像1,圖像2):圖像與運算實現(xiàn)疊加
4 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
opened = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
提取連續(xù)開閉區(qū)間用于降噪:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
設置卷積核,第一個參數(shù)代表卷積核形狀,有MORPH_RECT(矩形),MORPH_ELLIPSE(橢圓),MORPH_CROSS(十字形),第二個參數(shù)代表卷積核行和列
cv2.morphologyEx(要處理圖像,處理方式,卷積核)
opened = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
開運算,先腐蝕后膨脹,可以消除小黑點,平滑邊界。
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
閉運算,先膨脹后腐蝕,可以消除小黑洞文章來源:http://www.zghlxwxcb.cn/news/detail-446089.html
5 contours, hierarchy = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(src, contours, -1, (255, 0, 0), 2)
提取連續(xù)域,得到區(qū)間文章來源地址http://www.zghlxwxcb.cn/news/detail-446089.html
到了這里,關于備賽筆記:Opencv學習:顏色識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!