import cv2
import numpy as np
# 圓檢測演算法
def detect(img):
# 定義紅色、藍色、白色的hsv區間檔案
red1 = np.array([0, 100, 46])
red2 = np.array([8, 255, 255])
white1 = np.array([0, 0, 221])
white2 = np.array([180, 30, 255])
blue1 = np.array([100, 43, 46])
blue2 = np.array([124, 255, 255])
# 從rgb轉到hsv顏色空間
hsv = cv2.cvtcolor(img, cv2.color_bgr2hsv)
# 找到每個畫素的值,得到對應的單色影象
mask_red = cv2.inrange(hsv, red1, red2)
mask_white = cv2.inrange(hsv, white1, white2)
mask_blue = cv2.inrange(hsv, blue1, blue2)
result_red = cv2.bitwise_and(img, img, mask=mask_red)
result_white = cv2.bitwise_and(img, img, mask=mask_white)
result_blue = cv2.bitwise_and(img, img, mask=mask_blue)
# 對影象進行灰度化
gray_red = cv2.cvtcolor(result_red, cv2.color_bgr2gray)
gray_white = cv2.cvtcolor(result_white, cv2.color_bgr2gray)
gray_blue = cv2.cvtcolor(result_blue, cv2.color_bgr2gray)
# 對灰度影象進行輪廓提取,更加面積,去除較大或較小面積,儲存和圓相同的面積輪廓
# 定義繪製字型
font = cv2.font_hershey_******x
# 紅色輪廓
for i in contours:
# 計算輪廓面積
area = cv2.contourarea(i)
# 當面積在500-2000之間,才進行圓檢測
if 500 < area < 2000:
circles_red = cv2.houghcircles(gray_red, cv2.hough_gradient, 1,
50, param1=150, param2=20, minradius=5, maxradius=14)
# 若不為空,則進行繪製
if circles_red is not none:
circles_1 = np.uint16(np.around(circles_red))
for i in circles_1[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2) # 畫圓
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 2) # 畫圓心
cv2.puttext(img, 'red', (i[0], i[1]), font, 0.8, (0, 0, 255), 2)
# 白色輪廓
for i in contours2:
area = cv2.contourarea(i)
if 350 < area < 1500:
circles_white = cv2.houghcircles(gray_white, cv2.hough_gradient, 1,
20, param1=35, param2=20, minradius=0, maxradius=30)
if circles_white is not none:
circles_2 = np.uint16(np.around(circles_white))
for i in circles_2[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (255, 255, 255), 2) # 畫圓
cv2.circle(img, (i[0], i[1]), 2, (255, 255, 255), 2) # 畫圓心
cv2.puttext(img, 'white', (i[0], i[1]), font, 0.8, (255, 255, 255), 2)
# 因藍色輪廓較少,所以不需要進行輪廓提取
circles_blue = cv2.houghcircles(gray_blue, cv2.hough_gradient, 1,
50, param1=35, param2=20, minradius=5, maxradius=25)
if circles_blue is not none:
circles_3 = np.uint16(np.around(circles_blue))
for i in circles_3[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (255, 0, 0), 2) # 畫圓
cv2.circle(img, (i[0], i[1]), 2, (255, 0, 0), 2) # 畫圓心
cv2.puttext(img, 'blue', (i[0], i[1]), font, 0.8, (255, 0, 0), 2)
return img
cap = cv2.videocapture('demo/dsc_0001.mov')
while(cap.isopened()):
ret, frame = cap.read()
frame = cv2.resize(frame, (640, 480))
result = detect(frame)
cv2.imshow('frame', result)
if cv2.waitkey(25) & 0xff == ord('q'):
break
cap.release()
cv2.destroyallwindows()
谷歌缺陷檢測演算法 基於視覺的缺陷檢測概述
影象採集 預處理特徵提取 缺陷分類 特徵提取為其中的關鍵,缺陷特徵提取的好壞直接影響檢測的效果。預處理的目的是減少影象的雜訊,提高目標與背景的對比度,突出影象中的 缺陷特徵。小波技術在預處理中的應用 1.小波去噪 2.小波融合 可以將不同角度拍攝的影象進行融合 採用小波融合方法既能夠很好地保留幾幅源...
基於深度學習的目標檢測演算法 SSD
ssd single shot multibox detector 問題引入 目前,常見的目標檢測演算法,如faster r cnn,存在著速度慢的缺點。該 提出的ssd方法,不僅提高了速度,而且提高了準確度。ssd 該 的核心思想 該 的主要貢獻 1.提出了ssd目標檢測方法,在速度上,比之前最快...
基於深度學習的 目標檢測 演算法綜述
三部曲,這樣就有兩個難以解決的問題 其一是區域選擇的策略效果差 時間複雜度高 其二是手工提取的特徵魯棒性較差。傳統的區域選擇使用滑窗,每滑乙個視窗檢測一次,相鄰視窗資訊重疊高,檢測速度慢。r cnn 使用乙個啟發式方法 selective search 先生成候選區域再檢測,降低資訊冗餘程度,從而提...