Как использовать сложные или неправильные формы в качестве моего roi для обнаружения и отслеживания изображений с помощью функции мыши? - PullRequest
0 голосов
/ 31 мая 2019

В настоящее время я пытаюсь создать roi сложной / неправильной формы для обнаружения и отслеживания. Но не могу его создать.

Я могу нарисовать кривую вокруг своей сложной формы с помощью функции обратного вызова мыши, но я не знаю, как использовать мою замкнутую кривую для roi.

Это кадр из видео, над которым я работаю.

Изображение 1 frame

Изображение 2

image2

Форма на изображении2 - это область, которую я хочу, чтобы мои рои были для отслеживания. Я не хочу, чтобы мои рои были прямоугольной формы, потому что они не могли отслеживать мои рои. Форма на изображении 2 на самом деле является объектом, который я хочу отслеживать в видео.

Ниже приведен код для отслеживания с прямоугольником Roi.

import cv2
import sys
from matplotlib import pyplot as plt

(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')



# Set up tracker.
# Instead of MIL, you can also use

tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']
tracker_type = tracker_types[1]


if tracker_type == 'BOOSTING':
    tracker = cv2.TrackerBoosting_create()
elif tracker_type == 'MIL':
    tracker = cv2.TrackerMIL_create()
elif tracker_type == 'KCF':
    tracker = cv2.TrackerKCF_create()
elif tracker_type == 'TLD':
    tracker = cv2.TrackerTLD_create()
elif tracker_type == 'MEDIANFLOW':
    tracker = cv2.TrackerMedianFlow_create()
elif tracker_type == 'GOTURN':
    tracker = cv2.TrackerGOTURN_create()
elif tracker_type == 'MOSSE':
    tracker = cv2.TrackerMOSSE_create()
elif tracker_type == "CSRT":
    tracker = cv2.TrackerCSRT_create()

# Read video
video = cv2.VideoCapture("3umresize4.avi")


# Exit if video not opened.
if not video.isOpened():
    print "Could not open video"
    sys.exit()

# Read first frame.
ok, frame = video.read()
if not ok:
    print 'Cannot read video file'
    sys.exit()

# Define an initial bounding box
bbox = (287, 23, 86, 320)

# Uncomment the line below to select a different bounding box
bbox = cv2.selectROI(frame, False)

# Initialize tracker with first frame and bounding box
ok = tracker.init(frame, bbox)

while True:
    # Read a new frame
    ok, frame = video.read()
    if not ok:
        break

    # Start timer
    timer = cv2.getTickCount()

    # Update tracker
    ok, bbox = tracker.update(frame)

    # Calculate Frames per second (FPS)
    fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

    # Draw bounding box
    if ok:
        # Tracking success
        p1 = (int(bbox[0]), int(bbox[1]))
        p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
        cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)
    else :
        # Tracking failure
        cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)

    # Display tracker type on frame
    cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2);

    # Display FPS on frame
    cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);


    # Display result
    cv2.namedWindow("Tracking",cv2.WINDOW_NORMAL)
    cv2.imshow("Tracking", frame)

    # Exit if ESC pressed
    k = cv2.waitKey(1) & 0xff
    if k == 27 :

        break



cv2.destroyAllWindows()

Ниже приведен обратный вызов мыши для создания изображения2, в котором я хочу, чтобы область под контуром была обозначена в коде выше.

import cv2
import numpy as np 

drawing=False # true if mouse is pressed
mode=True # if True, draw rectangle. Press 'm' to toggle to curve

# mouse callback function
def drawcurve(event,former_x,former_y,flags,param):
    global current_former_x,current_former_y,drawing, mode


    if event==cv2.EVENT_LBUTTONDOWN:
        drawing=True
        current_former_x,current_former_y=former_x,former_y

    elif event==cv2.EVENT_MOUSEMOVE:
        if drawing==True:
            if mode==True:
                cv2.line(im,(current_former_x,current_former_y),(former_x,former_y),(0,0,255),5)
                current_former_x = former_x
                current_former_y = former_y
                #print former_x,former_y
    elif event==cv2.EVENT_LBUTTONUP:
        drawing=False
        if mode==True:
            cv2.line(im,(current_former_x,current_former_y),(former_x,former_y),(0,0,255),5)
            current_former_x = former_x
            current_former_y = former_y
    return former_x,former_y    

im = cv2.imread("sampleuct.bmp")
cv2.namedWindow("Bill BEGUERADJ OpenCV")
cv2.setMouseCallback('Bill BEGUERADJ OpenCV',drawcurve)
while(1):
    cv2.imshow('Bill BEGUERADJ OpenCV',im)
    k=cv2.waitKey(1)&0xFF
    if k==27:
        break
cv2.destroyAllWindows()

Можете ли вы помочь мне интегрировать мои рои с отслеживанием. Или любым другим способом, которым я мог бы это отследить.

1 Ответ

0 голосов
/ 31 мая 2019

Функции OpenCV напрямую не дадут вам то, что вы хотите, все эти трекеры предназначены для выполнения конкретных задач, которые в конечном итоге отслеживают локализованный регион, который является коробкой.

Поскольку вы хотите отслеживать форму как она есть, вы можете рассмотреть отслеживание на основе фильтра Калмана, где вы по существу отслеживаете точки. Вы можете выбрать точки интереса и подключить их в каждом кадре и отслеживать только эти точки. Возможно, вы захотите реализовать его и сами. Вы можете ссылаться на эту ссылку в качестве учебного пособия, чтобы напрямую использовать реализацию отслеживания Kalman Filter в OpenCV.

Вы также можете рассмотреть подход, основанный на глубоком обучении, используя семантические сети, в которых вы сегментируете области интереса в каждом кадре.

Один грязный трюк состоит в том, чтобы создать ваши roi как есть, и каждый раз, когда коробка обнаруживается, вы можете настроить размер roi в соответствии с размером коробки по мере необходимости и использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...