1.目辨別别與定位
對基于視覺的機械臂控制來說,機器人視覺是一個非常重要的部分。機器人隻有在視覺的指引下,才能擷取目标的正确資訊,進而控制機械臂完成指定任務。視覺系統必須在标定的基礎上,識别和跟蹤目标對象的位置和姿态。
在圖像中識别目标對象可以基于三個不同的屬性,即顔色,紋理,形狀。顔色特性是運用最廣泛,最容易學習與實作的方式,是以接下來采用基于顔色的物體識别方式。
2.實作方式
通過OpenCV的Python接口來實作物體的顔色特性識别。通過提取目标物體的顔色資訊進行HSV門檻值分割,得到目标物體的三維坐标。

HSV介紹
顔色空間轉換
基于彩色圖像分割的方法識别目标時,要選擇合适的顔色空間,常見的顔色空間有RGB,HSV,CMY等。HSV模型可以在一定程度上避免RGB模型的高分散性和高相關性所帶來的門檻值劃分問題。是以接下來的代碼是采用HSV顔色空間進行目辨別别,RGB到HSV的轉換公式是:
RGB2HSV
當然,opencv自身以及內建了各種顔色空間的轉換函數,是以在接下來的代碼中隻需調用其函數即可。
3.捕獲目标代碼
運作環境
- Python3.6.5
- Pycharm
- win10
import cv2
import numpy as np
capture = cv2.VideoCapture(0)
lower_blue = np.array([90, 110, 110])
upper_blue = np.array([140, 255, 255])
# 确定目标物體的HSV範圍 此範圍為藍色
while(True):
ret, frame = capture.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
if cv2.waitKey(1) == ord('q'):
break
實作效果
原圖
處理後圖像
4.鎖定目标,并擷取目标質心代碼
from collections import deque
import numpy as np
import cv2
import time
Lower = np.array([100, 43, 46])
Upper = np.array([130, 255, 255])
# 定義目标顔色HSV的範圍
mybuffer = 64
pts = deque(maxlen=mybuffer)
camera = cv2.VideoCapture(0)
time.sleep(2)
while True:
(ret, frame) = camera.read()
if not ret:
print('No Camera')
break
# frame = imutils.resize(frame, width=600)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 根據門檻值建構掩膜
mask = cv2.inRange(hsv, Lower, Upper)
# 腐蝕操作
mask = cv2.erode(mask, None, iterations=2)
# 膨脹操作,其實先腐蝕再膨脹的效果是開運算,去除噪點
mask = cv2.dilate(mask, None, iterations=2)
# 輪廓檢測
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
# 初始化目标輪廓質心
center = None
# 如果存在輪廓
if len(cnts) > 0:
# 找到面積最大的輪廓
c = max(cnts, key=cv2.contourArea)
# 确定面積最大的輪廓的外接圓
((x, y), radius) = cv2.minEnclosingCircle(c)
# 計算輪廓的矩
M = cv2.moments(c)
# 計算質心
center = (int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]))
if 80 > radius > 20:
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
# 把質心添加到pts中,并且是添加到清單左側
pts.appendleft(center)
cv2.imshow('Frame', frame)
# 鍵盤檢測,檢測到esc鍵退出
k = cv2.waitKey(5)&0xFF
if k == 27:
break
# 攝像頭釋放
camera.release()
# 銷毀所有視窗
cv2.destroyAllWindows()
關于圖像處理的膨脹和腐蝕操作:膨脹就是求局部最大值的操作,相反,腐蝕是求局部最小值的操作。
具體可參考這個
Python+OpenCV教程12:腐蝕與膨脹先腐蝕後膨脹會分離物體,是以叫開運算,常用來去除小區域物體;
先膨脹後腐蝕會消除物體内的小洞,是以叫閉運算。
注意:腐蝕和膨脹是針對圖檔中的白色部分!
腐蝕/膨脹
開/閉運算的了解
圖中黃色圈為最大外接圓,紅點為質心
對于環境的要求較高,雖然可以設定捕獲物體半徑大小,但最好目标顔色為環境中獨一無二的顔色。
參考資料:
opencv教程 基于雙目視覺的機器人目标定位與機械臂控制 python+opencv實踐