深深
import CV2
import numpy as np
# 識(shí)別圓和直線
def recognize_c_l(video):
? ? # 獲取高和寬
? ? height = video.shape[0]
? ? width = video.shape[1]
? ? # 轉(zhuǎn)為灰度圖
? ? gray_img = CV2.cvtColor(video, CV2.COLOR_BGRA2GRAY)
? ? # 進(jìn)行中值模糊,去噪點(diǎn)
? ? img = CV2.medianBlur(gray_img, 7)
? ? # 霍夫圓檢測(cè)
? ? circles = CV2.HoughCircles(img, CV2.HOUGH_GRADIENT, 1, 50, param1=100, param2=75, minRadius=0, maxRadius=0)
? ? # 在檢測(cè)到圓的情況下輸出圓坐標(biāo),并畫(huà)圓
? ? if circles is not None:
? ? ? ? circles = np.uint16(np.around(circles))
? ? ? ? # print(circles)
? ? ? ? for i in circles[0, :]:? # 遍歷矩陣每一行的數(shù)據(jù)
? ? ? ? ? ? CV2.circle(video, (i[0], i[1]), i[2], (0, 255, 0), 2)
? ? ? ? ? ? CV2.circle(video, (i[0], i[1]), 2, (0, 0, 255), 3)
? ? ? ? ? ? # 偏離坐標(biāo)顯示
? ? ? ? ? ? h = int(height / 2 - i[1])
? ? ? ? ? ? w = int(i[0] - width / 2)
? ? ? ? ? ? # print("(%d,%d)" % (w, h))
? ? ? ? ? ? # 坐標(biāo)顯示
? ? ? ? ? ? str1 = '(' + str(w) + ',' + str(h) + ')'
? ? ? ? ? ? CV2.putText(video, str1, (int(i[0]) - 50, int(i[1]) + 40), CV2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2,
? ? ? ? ? ? ? ? ? ? ? ? CV2.LINE_AA)
? ? # canny邊緣檢測(cè)
? ? canny = CV2.Canny(gray_img, 30, 150)
? ? # 霍夫直線檢測(cè)
? ? lines = CV2.HoughLines(canny, 1, np.pi / 180, 200)
? ? if lines is not None:
? ? ? ? lines1 = lines[:, 0, :]
? ? ? ? for rho, theta in lines1[:]:
? ? ? ? ? ? a = np.cos(theta)
? ? ? ? ? ? b = np.sin(theta)
? ? ? ? ? ? x0 = a * rho
? ? ? ? ? ? y0 = b * rho
? ? ? ? ? ? x1 = int(x0 + 3000 * (-b))
? ? ? ? ? ? y1 = int(y0 + 3000 * (a))
? ? ? ? ? ? x2 = int(x0 - 3000 * (-b))
? ? ? ? ? ? y2 = int(y0 - 3000 * (a))
? ? ? ? ? ? CV2.line(video, (x1, y1), (x2, y2), (0, 0, 255), 2)
? ? return video
# 識(shí)別色塊
def recognize_color(target_color, img):
? ? height = img.shape[0]
? ? width = img.shape[1]
? ? # 高斯模糊
? ? gs_frame = CV2.GaussianBlur(img, (5, 5), 0)
? ? # HSV轉(zhuǎn)化
? ? hsv = CV2.cvtColor(gs_frame, CV2.COLOR_BGR2HSV)
? ? erode_hsv = CV2.erode(hsv, None, iterations=2)
? ? for i in target_color:
? ? ? ? mask = CV2.inRange(erode_hsv, color_dist[i]['Lower'], color_dist[i]['Upper'])
? ? ? ? if i == target_color[0]:
? ? ? ? ? ? inRange_hsv = CV2.bitwise_and(erode_hsv, erode_hsv, mask=mask)
? ? ? ? else:
? ? ? ? ? ? inRange_hsv1 = CV2.bitwise_and(erode_hsv, erode_hsv, mask=mask)
? ? ? ? ? ? inRange_hsv = CV2.add(inRange_hsv, inRange_hsv1)
? ? inRange_gray = CV2.cvtColor(inRange_hsv, CV2.COLOR_BGR2GRAY)
? ? contours, hierarchy = CV2.findContours(inRange_gray, CV2.RETR_TREE, CV2.CHAIN_APPROX_NONE)
? ? for c in contours:
? ? ? ? if CV2.contourArea(c) < 2000:? # 過(guò)濾掉較面積小的物體
? ? ? ? ? ? continue
? ? ? ? else:
? ? ? ? ? ? target_list.append(c)? # 將面積較大的物體視為目標(biāo)并存入目標(biāo)列表
? ? # for i in target_list:? # 繪制目標(biāo)外接矩形
? ? # rect = CV2.minAreaRect(i)
? ? # box = CV2.boxPoints(rect)
? ? # CV2.drawContours(draw_img, [np.int0(box)], -1, (0, 255, 255), 2)
? ? for c in target_list:
? ? ? ? # 找坐標(biāo)
? ? ? ? M = CV2.moments(c)
? ? ? ? center_x = int(M['m10'] / M['m00'])
? ? ? ? center_y = int(M['m01'] / M['m00'])
? ? ? ? # print('center_x:', center_x)
? ? ? ? # print('center_y:', center_y)
? ? ? ? # 繪制中心點(diǎn)
? ? ? ? CV2.circle(img, (center_x, center_y), 7, 128, -1)
? ? ? ? h = int(height / 2 - center_y)
? ? ? ? w = int(center_x - width / 2)
? ? ? ? str1 = '(' + str(w) + ',' + str(h) + ')'
? ? ? ? CV2.putText(img, str1, (center_x - 50, center_y + 40), CV2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2,
? ? ? ? ? ? ? ? ? ? CV2.LINE_AA)
? ? return img
# 顏色列表
color_dist = {'red': {'Lower': np.array([156, 128, 46]), 'Upper': np.array([180, 255, 255])},
? ? ? ? ? ? ? 'yellow': {'Lower': np.array([15, 160, 50]), 'Upper': np.array([35, 255, 255])},
? ? ? ? ? ? ? 'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},
? ? ? ? ? ? ? 'blue': {'Lower': np.array([80, 80, 150]), 'Upper': np.array([110, 255, 255])},
? ? ? ? ? ? ? }
# 目標(biāo)顏色(待識(shí)別)
target_color = ['blue']
# 調(diào)用攝像頭
cap = CV2.VideoCapture(0)
while cap.isOpened():
? ? target_list = []
? ? # 逐幀捕獲
? ? ret, frame = cap.read()
? ? # 展示捕獲的原圖像
? ? # CV2.imshow("capture", frame)
? ? # CV2.waitKey(1)
? ? # 展示處理圖
? ? process_1 = recognize_color(target_color, frame)
? ? process_2 = recognize_c_l(process_1)
? ? CV2.imshow("process", process_2)
? ? # 按Esc退出
? ? if CV2.waitKey(30) & 0xff == 27:
? ? ? ? break
? ? # 一切完成后,釋放捕獲
cap.release()
CV2.destroyAllWindows()