首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将KCF跟踪器与RGB和HFV口罩一起使用?

如何将KCF跟踪器与RGB和HFV口罩一起使用?
EN

Stack Overflow用户
提问于 2018-11-05 12:26:29
回答 1查看 407关注 0票数 1

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

作为一个基本的测试,我已经让它跟踪颜色绿色使用霓虹灯绿色创可贴。

基于我看过的另一个教程,我交叉引用了一些例子来设置颜色和HSV蒙版,以区分绿色和源帧。cv2.imshow('mask', mask)向我展示了它检测到的绿色很好。

我想将KCF算法用于跟踪器,因为这一算法似乎是通用和准确性最好的算法。然后我创建了我们的跟踪器tracker1 = cv2.TrackerKCF_create()。这就是我迷路的地方。我找不到语法和合适的方法将我的跟踪器应用到蒙版上,并在它们周围创建一个框。

在我基于此的众多示例中,有一个使用了读/写图像方法,该方法不是实时的。另一个例子是使用mean-shift算法并将掩码直接实现到cv2.meanshift()方法的参数中。

通过更多的googling搜索,我发现了Python herehere的其他一些示例。但我发现很难分解代码语法,因为他们在所有不同类型的算法列表中实现了它。对于示例视频,他们似乎还初始化了静止帧开头的ROI (感兴趣区域)作为跟踪器要跟踪的参考点,并且根本不使用蒙版。

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

虽然我让口罩起作用了,但我很难优化它们来拾取绿色。我对图片中的颜色进行了jpg压缩,并使用在线RGB颜色摘要生成器对其进行了分析。结果如下所示

然后我尝试对绿色使用给定的RGB值,每个最小值的范围为+(-20),每个最大值的范围为+(20),但它无法检测到特定的颜色。因此,我试着使用它,直到我得到了一个足够广泛的工作范围:

代码语言:javascript
复制
min_green = np.array([0, 90, 0])
max_green = np.array([100, 255, 100])

再一次,在所有的例子中,我都被提供了。它们只是简单地“提前知道”这些值,而不是描述如何在实践中提取和插值数据。

这是我现在的节目。

代码语言:javascript
复制
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()

EN

回答 1

Stack Overflow用户

发布于 2019-12-06 13:15:33

我认为你对绿色的阈值不正确。也许可以创建一个跟踪器来获取特定图像的阈值。

cv.CreateTrackbar(trackbarName,windowName,value,count,onChange)> Blockquote

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53148335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档