我一直在尝试将我的通用运动跟踪器更改为对象跟踪器,以便在运动相机项目中进一步实现。
作为一个基本的测试,我已经让它跟踪颜色绿色使用霓虹灯绿色创可贴。
基于我看过的另一个教程,我交叉引用了一些例子来设置颜色和HSV蒙版,以区分绿色和源帧。cv2.imshow('mask', mask)向我展示了它检测到的绿色很好。
我想将KCF算法用于跟踪器,因为这一算法似乎是通用和准确性最好的算法。然后我创建了我们的跟踪器tracker1 = cv2.TrackerKCF_create()。这就是我迷路的地方。我找不到语法和合适的方法将我的跟踪器应用到蒙版上,并在它们周围创建一个框。
在我基于此的众多示例中,有一个使用了读/写图像方法,该方法不是实时的。另一个例子是使用mean-shift算法并将掩码直接实现到cv2.meanshift()方法的参数中。
通过更多的googling搜索,我发现了Python here和here的其他一些示例。但我发现很难分解代码语法,因为他们在所有不同类型的算法列表中实现了它。对于示例视频,他们似乎还初始化了静止帧开头的ROI (感兴趣区域)作为跟踪器要跟踪的参考点,并且根本不使用蒙版。
我也无法运行任何示例代码,因为第一行(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')总是给我一个引用错误,而且我还没有找到其他方法来编译它。我对python还是比较陌生的。
虽然我让口罩起作用了,但我很难优化它们来拾取绿色。我对图片中的颜色进行了jpg压缩,并使用在线RGB颜色摘要生成器对其进行了分析。结果如下所示

然后我尝试对绿色使用给定的RGB值,每个最小值的范围为+(-20),每个最大值的范围为+(20),但它无法检测到特定的颜色。因此,我试着使用它,直到我得到了一个足够广泛的工作范围:
min_green = np.array([0, 90, 0])
max_green = np.array([100, 255, 100])再一次,在所有的例子中,我都被提供了。它们只是简单地“提前知道”这些值,而不是描述如何在实践中提取和插值数据。
这是我现在的节目。
from __future__ import division
import cv2
from matplotlib import pyplot as plt
import numpy as np
from math import cos, sin
# declare var first_frame.
first_frame = None
# read from webcam.
video = cv2.VideoCapture(0)
# declare var frame_count.
frame_count = 1
# start our loop.
while True:
# FRAME DETECTION
# count frames.
frame_count = frame_count + 1
# read and store frame matrix into var 'frame'.
check, frame = video.read()
print(frame)
# MOTION DETECTION
# convert 'frame' to greyscale as 'gray'.
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# apply guassianblur on 'gray' to reduce noise.
gray = cv2.GaussianBlur(gray, (21, 21), 0)
# convert first_frame to gray for abs.dif processing later.
if first_frame is None:
first_frame = gray
continue
# COLOR DETECTION
# apply guassianblur on frame to reduce noise.
image_blur = cv2.GaussianBlur(frame, (21, 21), 0)
# convert to correct color scheme.
image_rgb = cv2.cvtColor(image_blur, cv2.COLOR_BGR2RGB)
# convert to HSV.
image_blur_hsv = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2HSV)
# COLOR FILTER
# filter by color matrix.
min_green = np.array([0, 90, 0])
max_green = np.array([80, 255, 80])
mask1 = cv2.inRange(image_blur_hsv, min_green, max_green)
# filter by brightness.
min_red_brightness = np.array([83, 36, 43])
max_red_brightness = np.array([103, 56, 63])
mask2 = cv2.inRange(image_blur_hsv, min_red_brightness, max_red_brightness)
# take the two filters and combine.
mask = mask1 + mask2
cv2.imshow('mask', mask1)
# OBJECT DETECTION
# create a tracker.
tracker1 = cv2.TrackerKCF_create()
# SEGMENTATION (ALL OLDER MOTION DETECTION STUFF)
delta_frame = cv2.absdiff(first_frame, gray)
thresh_delta = cv2.threshold(delta_frame, 40, 255, cv2.THRESH_BINARY)[1]
(_, cnts, _) = cv2.findContours(thresh_delta.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in cnts:
if cv2.contourArea(contour) < 200:
continue
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('captureFrame', frame)
cv2.imshow('captureGrey', gray)
cv2.imshow('delta', delta_frame)
cv2.imshow('thresh', thresh_delta)
key = cv2.waitKey(1)
if key == ord('q'):
break
print(frame_count)
video.release()
cv2.destroyAllWindows()

发布于 2019-12-06 13:15:33
我认为你对绿色的阈值不正确。也许可以创建一个跟踪器来获取特定图像的阈值。
cv.CreateTrackbar(trackbarName,windowName,value,count,onChange)> Blockquote
https://stackoverflow.com/questions/53148335
复制相似问题