圓形檢測演算法 基於顏色和形狀(opencv)

2021-10-22 05:01:12 字數 3160 閱讀 5802

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 先生成候選區域再檢測,降低資訊冗餘程度,從而提...