使用Python,OpenCV转换颜色空间,追踪对象的轨迹
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV转换颜色空间,追踪对象的轨迹
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python,OpenCV轉換顏色空間,追蹤對象的軌跡
- 1. 效果圖
- 2. 源碼
- 參考
這篇博客可以看作是之前倆篇博客的融合,將介紹如何使用Python,OpenCV轉換顏色空間,并利用HSV追蹤對象,并繪制其軌跡;
- OpenCV最經典的3種顏色空間(cv2.cvtColor)及互相轉換
- 使用Python,OpenCV捕獲關鍵事件,并進行視頻剪輯
- 計算HSV空間的上限與下限值;
- BGR轉HSV空間;
- 追蹤對像,并繪制軌跡;
1. 效果圖
綠色的薄荷膏藥瓶成功被檢測到~
藥瓶底部純綠色也被檢測到了,如圖~
追蹤綠色瓶并繪制最近的軌跡線效果圖如下:
2. 源碼
# 將圖像從一種顏色空間轉換為另一種顏色空間,例如 BGR、RGB、Gray、HSV 等。
# 創建一個應用程序來提取視頻中的彩色對象
# OpenCV 中有超過 150 種顏色空間轉換方法可用,本文只介紹最經典的2中:BGR、HSV及互轉# USAGE
# python change_colorspace_Object_Tracking.py
from collections import dequeimport cv2# 遍歷查看所有顏色空間
import imutilsflags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
print(len(flags))# 對于 HSV,色調范圍為 [0,179],飽和度范圍為 [0,255],值范圍為 [0,255]。不同的軟件使用不同的尺度。因此,如果您將 OpenCV 值與它們進行比較,則需要對這些范圍進行歸一化。
# 對象跟蹤,可以使用HSV來提取彩色對象。這是最簡單的對象追蹤,找到物體的質心,就可以繪制軌跡來追蹤物體;
import cv2
import numpy as npcap = cv2.VideoCapture(0)
pts = deque(maxlen=64)
while (1):# 獲取每一幀_, frame = cap.read()frame = imutils.resize(frame,width=400)if frame is None:break# 轉換BGR為HSVhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 定義綠色的HSV空間值lower_blue = np.array([29, 86, 6])upper_blue = np.array([64, 255, 255])# 閾值化圖像,只獲取綠色mask = cv2.inRange(hsv, lower_blue, upper_blue)mask = cv2.erode(mask, None, iterations=2)mask = cv2.dilate(mask, None, iterations=2)# 尋找mask中的輪廓,并初始化球當前的中心(x,y)cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)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"]))# 當圓半徑大于5時繼續處理if radius > 5:# 在幀上繪制綠色球的外接圓及中心cv2.circle(frame, (int(x), int(y)), int(radius),(0, 255, 255), 2)cv2.circle(frame, center, 5, (0, 0, 255), -1)# 更新中心點隊列pts.appendleft(center)# 遍歷追蹤到的中心點坐標for i in range(1, len(pts)):# 如果為None,忽略if pts[i - 1] is None or pts[i] is None:continue# 否則繪制線連接thickness = int(np.sqrt(64 / float(i + 1)) * 2.5)cv2.line(frame, pts[i - 1], pts[i], (0, 0, 255), thickness)# 展示幀到屏幕cv2.imshow("Frame", frame)# 對圖像執行按位與操作# res = cv2.bitwise_and(frame, frame, mask=mask)## cv2.imshow('frame', frame)# cv2.imshow('mask', mask)# cv2.imshow('res', res)k = cv2.waitKey(5) & 0xFFif k == 27:breakcv2.destroyAllWindows()# 如何找到HSV空間值呢?
# 比如要尋找綠色,可以找到BGR(0,255,0) ,轉換為HSV,然后取[ H-10,S,V]為下限 -- [ H+10,S,V]為上限;
green = np.uint8([[[0, 255, 0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv_green)
# [[[60 255 255]]]
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#converting-colorspaces
總結
以上是生活随笔為你收集整理的使用Python,OpenCV转换颜色空间,追踪对象的轨迹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV制作图像M
- 下一篇: 10000+ gif表情包不是梦,get