カルマン フィルターの例 - オレンジの軌跡の予測

目次

処理する

1. 輪郭法を使用してオレンジの位置を検出する

(1) スクロールバー取得閾値 

(2) 画像中のオレンジ色に対応する白い図形を囲む最小の四角枠の情報を取得する

2. オレンジ色の検出ボックスの重心を取得します

3. セントロイドをカルマン フィルターに送信して、次のセントロイド位置を取得します。

4. 効果を視覚的に表示できるように、描画重心の中心にある円 


処理する

step1: オレンジの検出枠を取得する

step2: オレンジの重心を見つける

ステップ 3: 重心をカルマン フィルターに送信して、次のオレンジの予測重心位置を取得します。

1. 輪郭法を使用してオレンジの位置を検出する

ステップ:

  • OpenCV スクロール バーを使用してしきい値を決定する
  • 高しきい値と低しきい値を設定し、inRange 関数を使用してイメージをバイナリ イメージに変換し、その後の輪郭抽出を容易にします。
  • findContours 関数を使用してバイナリ イメージ内のすべての輪郭を抽出し、cv2.RETR_TREE を使用して輪郭レベル ツリーを構築します。
  • 階層ツリーは最初は昇順です。最大の等高線を取得してから、降順で並べ替えます
  • 最後に、最初の輪郭の最小外側境界のパラメーターは、boundingRect で取得できます。

(1) スクロールバー取得閾値 

ビデオ内のオレンジの写真のスクリーンショット

コード

import cv2
import numpy as np

def nothing(x):
    pass

cv2.namedWindow('image')
cv2.createTrackbar('a','image',0,255,nothing)
cv2.createTrackbar('b','image',0,255,nothing)
cv2.createTrackbar('c','image',0,255,nothing)
cv2.createTrackbar('d','image',0,255,nothing)
cv2.createTrackbar('e','image',0,255,nothing)
cv2.createTrackbar('f','image',0,255,nothing)

frame = cv2.imread('orange.jpg')
frame = cv2.resize(frame,(700,400))

while True:
    a = cv2.getTrackbarPos('a', 'image')
    b = cv2.getTrackbarPos('b', 'image')
    c = cv2.getTrackbarPos('c', 'image')
    d = cv2.getTrackbarPos('d', 'image')
    e = cv2.getTrackbarPos('e', 'image')
    f = cv2.getTrackbarPos('f', 'image')
    hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    low_orange = np.array([a, b, c])
    high_orange = np.array([d, e, f])
    mask = cv2.inRange(hsv_img, low_orange, high_orange)
    cv2.imshow('image',mask)
    k = cv2.waitKey(1)&0xff
    if k==27:
        break

(2) 画像中のオレンジ色に対応する白い図形を囲む最小の四角枠の情報を取得する

オレンジ色のアウトライン最小外枠コードを検出

import cv2
import numpy as np

class OrangeDetector:
    def __init__(self):
        self.low_orange = np.array([10, 152, 89])
        self.high_orange = np.array([180, 255, 255])

    def detect(self, frame):
        hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv_img, self.low_orange, self.high_orange)
        contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        contours = sorted(contours, key=lambda x: cv2.contourArea(x), reverse=True)
        box = (0, 0, 0, 0)
        for cnt in contours:
            (x, y, w, h) = cv2.boundingRect(cnt)
            box = (x, y, x + w, y + h)
            break
        return box

2. オレンジ色の検出ボックスの重心を取得します

od = OrangeDetector()
orange_bbox = od.detect(frame)
x, y, x2, y2 = orange_bbox
cx = int((x + x2) / 2)
cy = int((y + y2) / 2)

3. セントロイドをカルマン フィルターに送信して、次のセントロイド位置を取得します。

predicted = kf.predict(cx, cy)

4. 効果を視覚的に表示できるように、描画重心の中心にある円 

カルマン フィルターの予測コード

import cv2
from orange_detector import OrangeDetector
from kalmanfilter import KalmanFilter

cap = cv2.VideoCapture("orange.mp4")
od = OrangeDetector()
kf = KalmanFilter()

while True:
    ret, frame = cap.read()
    if ret is False:
        break

    orange_bbox = od.detect(frame)
    x, y, x2, y2 = orange_bbox
    cx = int((x + x2) / 2)
    cy = int((y + y2) / 2)

    predicted = kf.predict(cx, cy)
    cv2.circle(frame, (cx, cy), 20, (0, 0, 255), 4)
    cv2.circle(frame, (predicted[0], predicted[1]), 20, (255, 0, 0), 4)

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(10)
    if key == 27:
        break

おすすめ

転載: blog.csdn.net/weixin_54627824/article/details/127472819
おすすめ