天天看點

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

1.目辨別别與定位

對基于視覺的機械臂控制來說,機器人視覺是一個非常重要的部分。機器人隻有在視覺的指引下,才能擷取目标的正确資訊,進而控制機械臂完成指定任務。視覺系統必須在标定的基礎上,識别和跟蹤目标對象的位置和姿态。

在圖像中識别目标對象可以基于三個不同的屬性,即顔色,紋理,形狀。顔色特性是運用最廣泛,最容易學習與實作的方式,是以接下來采用基于顔色的物體識别方式。

2.實作方式

通過OpenCV的Python接口來實作物體的顔色特性識别。通過提取目标物體的顔色資訊進行HSV門檻值分割,得到目标物體的三維坐标。

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

HSV介紹

顔色空間轉換

基于彩色圖像分割的方法識别目标時,要選擇合适的顔色空間,常見的顔色空間有RGB,HSV,CMY等。HSV模型可以在一定程度上避免RGB模型的高分散性和高相關性所帶來的門檻值劃分問題。是以接下來的代碼是采用HSV顔色空間進行目辨別别,RGB到HSV的轉換公式是:

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

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
           

實作效果

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

原圖

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

處理後圖像

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:腐蝕與膨脹

先腐蝕後膨脹會分離物體,是以叫開運算,常用來去除小區域物體;

先膨脹後腐蝕會消除物體内的小洞,是以叫閉運算。

注意:腐蝕和膨脹是針對圖檔中的白色部分!

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

腐蝕/膨脹

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

開/閉運算的了解

基于顔色特性的目辨別别方法1.目辨別别與定位2.實作方式3.捕獲目标代碼4.鎖定目标,并擷取目标質心代碼

圖中黃色圈為最大外接圓,紅點為質心

對于環境的要求較高,雖然可以設定捕獲物體半徑大小,但最好目标顔色為環境中獨一無二的顔色。

參考資料:

opencv教程 基于雙目視覺的機器人目标定位與機械臂控制 python+opencv實踐

繼續閱讀