如何使用带有RGB和HFV遮罩的KCF跟踪器?

时间:2018-11-05 04:26:29

标签: python opencv

我一直在尝试将通用运动跟踪器更改为对象跟踪器,以进一步实施到运动相机项目中。

作为一项基本测试,我一直使用霓虹绿绷带使其跟踪绿色。

基于我看到的另一个教程,我交叉引用了一些示例来设置颜色和HSV蒙版,以将绿色与源帧区分开。 cv2.imshow('mask', mask)告诉我它正在检测绿色就可以了。

我想对跟踪器使用KCF算法,因为对于通用目的和准确性,这似乎是最好的一种。因此,我创建了跟踪器tracker1 = cv2.TrackerKCF_create()。这就是我迷路的地方。我无法弄清楚将跟踪器应用于蒙版并在蒙版周围创建框的语法和正确方法。

我基于许多示例之一使用了非实时的读/写图像方法。另一个示例是使用均值漂移算法,并将掩码直接应用于cv2.meanshift()方法的参数中。

通过更多的谷歌搜索,我发现了Python herehere的其他一些示例。但是我发现很难分解代码语法,因为他们在所有不同类型算法的列表中实现了代码语法。对于示例视频,他们似乎还初始化了静止帧开始处的ROI(感兴趣区域),以供跟踪器跟踪并完全不使用遮罩的参考点。

我也无法运行任何示例代码,因为第一行(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')总是给我一个参考错误,而且我还没有找到一种方法来编译它。我对python还是比较陌生。

尽管我可以使用口罩,但是我很难优化它们以获取绿色。我拍摄了图像中颜色的jpg,并使用在线RGB颜色汇总器对其进行了分析。结果可以在下面的image

中看到

然后我尝试将给定的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()

run

1 个答案:

答案 0 :(得分:0)

我认为您的绿色阈值不正确。也许创建一个跟踪器以获得特定图像的阈值。

  

cv.CreateTrackbar(trackbarName,windowName,value,count,onChange)>块引用