Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

how to detect 2 other objects? use camshift

hi all.

I'm newbie in opencv. i have just 1 question.

i want to tracking 2 or more(3++) objects.

i only make just 1 tracking object source code.

then, how to add more detecting?

plz tell me how to add.

this is my code:

import cv2 import numpy as np

col, width, row, height = -1,-1,-1,-1

frame = None

frame2 = None frame3 = None

inputmode1 = False inputmode2 = False

rectangle1 = False rectangle2 = False

trackWindow1 = None trackWindow2 = None

roi_hist = None

def onMouse(event, x, y, flags, param): global col, width, row, height, frame, frame2, frame3, inputmode1, inputmode2 global rectangle1, roi_hist, trackWindow1, trackWindow2, rectangle2

if inputmode1:

    # 마우스클릭 이벤트
    if event == cv2.EVENT_LBUTTONDOWN:
        # 그리기 활성화
        rectangle1 = True
        col, row = x,y

    elif event == cv2.EVENT_MOUSEMOVE:

        if rectangle1:             
            frame = frame2.copy()
            cv2.rectangle(frame,(col, row), (x,y),(0,255,0),2)
            cv2.imshow('frame',frame)

    elif event == cv2.EVENT_LBUTTONUP:

        inputmode1 = False
        rectangle1 = False
        cv2.rectangle(frame,(col,row),(x,y),(0,255,0),2)
        height, width = abs(row-y),abs(col-x)
        trackWindow1 = (col, row, width, height)
        roi = frame[row:row+height, col:col+width]
        roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
        roi_hist = cv2.calcHist([roi],[0], None, [180],[0,180])
        cv2.normalize(roi_hist, roi_hist, 0 , 255, cv2.NORM_MINMAX)

if inputmode2:

    if event == cv2.EVENT_LBUTTONDOWN:
        # 그리기 활성화
        rectangle2 = True
        col, row = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if rectangle2:               
            frame = frame3.copy()
            # 마우스 이동경로에 맞게 초록색 사각형범위 생성
            cv2.rectangle(frame,(col, row), (x,y),(255,0,0),2)
            cv2.imshow('frame',frame)    
    elif event == cv2.EVENT_LBUTTONUP:           
        inputmode2 = False
        rectangle2 = False
        cv2.rectangle(frame,(col,row),(x,y),(255,0,0),2)
        height, width = abs(row-y),abs(col-x)
        trackWindow2 = (col, row, width, height)
        roi = frame[row:row+height, col:col+width]
        roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
        roi_hist = cv2.calcHist([roi],[0], None, [180],[0,180])
        cv2.normalize(roi_hist, roi_hist, 0 , 255, cv2.NORM_MINMAX)
return

def CamShift(): global frame, frame2, frame3, inputmode1,inputmode2,trackWindow1, trackWindow2, roi_hist

try:
    cap = cv2.VideoCapture(1)

except Exception as e:
    print(e)
    return

ret, frame = cap.read()
cv2.namedWindow('frame')
# frame, frame2 에 대한 마우스 액션에 대한 작업

cv2.setMouseCallback('frame',onMouse,param=(frame,frame2, frame3)) 
termination = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret, frame = cap.read()

    if not ret:
        break

    if trackWindow1 is not None:

        hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
        cv2.imshow('dst',dst)

        ret, trackWindow1 = cv2.CamShift(dst, trackWindow1, termination)

        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)

        cv2.polylines(frame,[pts],True,(0,255,0),2)

    elif trackWindow2 is not None:

        hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
        cv2.imshow('dst',dst)

        ret, trackWindow2 = cv2.CamShift(dst, trackWindow2, termination)

        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)

        cv2.polylines(frame,[pts],True,(255,0,0),2)

    cv2.imshow('frame',frame)

    k = cv2.waitKey(1)
    if k == 27:
        break

    if k == ord('1'):
        print("please select figure #1")
        inputmode1 = True

        frame2 = frame.copy()

        cv2.imshow('frame',frame)
        cv2.waitKey(0)

    if k == ord('2'):
        print("please select figure #2")
        inputmode2 = True

        frame3 = frame.copy()

        cv2.imshow('frame',frame)
        cv2.waitKey(0)       

cap.release()
cv2.destroyAllWindows()

CamShift()

how to detect 2 other objects? use camshift

hi all.

I'm newbie in opencv. i have just 1 question.

i want to tracking 2 or more(3++) objects.

i only make just 1 tracking object source code.

then, how to add more detecting?

plz tell me how to add.

this is my code:

import cv2 import numpy as np

col, width, row, height = -1,-1,-1,-1

frame = None

frame2 = None frame3 = None

inputmode1 = False inputmode2 = False

rectangle1 = False rectangle2 = False

trackWindow1 = None trackWindow2 = None

roi_hist = None

def onMouse(event, x, y, flags, param): global col, width, row, height, frame, frame2, frame3, inputmode1, inputmode2 global rectangle1, roi_hist, trackWindow1, trackWindow2, rectangle2

if inputmode1:

    # 마우스클릭 이벤트
    if event == cv2.EVENT_LBUTTONDOWN:
        # 그리기 활성화
        rectangle1 = True
        col, row = x,y

    elif event == cv2.EVENT_MOUSEMOVE:

        if rectangle1:             
            frame = frame2.copy()
            cv2.rectangle(frame,(col, row), (x,y),(0,255,0),2)
            cv2.imshow('frame',frame)

    elif event == cv2.EVENT_LBUTTONUP:

        inputmode1 = False
        rectangle1 = False
        cv2.rectangle(frame,(col,row),(x,y),(0,255,0),2)
        height, width = abs(row-y),abs(col-x)
        trackWindow1 = (col, row, width, height)
        roi = frame[row:row+height, col:col+width]
        roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
        roi_hist = cv2.calcHist([roi],[0], None, [180],[0,180])
        cv2.normalize(roi_hist, roi_hist, 0 , 255, cv2.NORM_MINMAX)

if inputmode2:

    if event == cv2.EVENT_LBUTTONDOWN:
        # 그리기 활성화
        rectangle2 = True
        col, row = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if rectangle2:               
            frame = frame3.copy()
            # 마우스 이동경로에 맞게 초록색 사각형범위 생성
             cv2.rectangle(frame,(col, row), (x,y),(255,0,0),2)
            cv2.imshow('frame',frame)    
    elif event == cv2.EVENT_LBUTTONUP:           
        inputmode2 = False
        rectangle2 = False
        cv2.rectangle(frame,(col,row),(x,y),(255,0,0),2)
        height, width = abs(row-y),abs(col-x)
        trackWindow2 = (col, row, width, height)
        roi = frame[row:row+height, col:col+width]
        roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
        roi_hist = cv2.calcHist([roi],[0], None, [180],[0,180])
        cv2.normalize(roi_hist, roi_hist, 0 , 255, cv2.NORM_MINMAX)
return

def CamShift(): global frame, frame2, frame3, inputmode1,inputmode2,trackWindow1, trackWindow2, roi_hist

try:
    cap = cv2.VideoCapture(1)

except Exception as e:
    print(e)
    return

ret, frame = cap.read()
cv2.namedWindow('frame')
# frame, frame2 에 대한 마우스 액션에 대한 작업
 
cv2.setMouseCallback('frame',onMouse,param=(frame,frame2, frame3)) 
termination = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret, frame = cap.read()

    if not ret:
        break

    if trackWindow1 is not None:

        hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
        cv2.imshow('dst',dst)

        ret, trackWindow1 = cv2.CamShift(dst, trackWindow1, termination)

        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)

        cv2.polylines(frame,[pts],True,(0,255,0),2)

    elif trackWindow2 is not None:

        hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
        cv2.imshow('dst',dst)

        ret, trackWindow2 = cv2.CamShift(dst, trackWindow2, termination)

        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)

        cv2.polylines(frame,[pts],True,(255,0,0),2)

    cv2.imshow('frame',frame)

    k = cv2.waitKey(1)
    if k == 27:
        break

    if k == ord('1'):
        print("please select figure #1")
        inputmode1 = True

        frame2 = frame.copy()

        cv2.imshow('frame',frame)
        cv2.waitKey(0)

    if k == ord('2'):
        print("please select figure #2")
        inputmode2 = True

        frame3 = frame.copy()

        cv2.imshow('frame',frame)
        cv2.waitKey(0)       

cap.release()
cv2.destroyAllWindows()

CamShift()

how to detect 2 other objects? use camshift

hi all.

I'm newbie in opencv. i have just 1 question.

i want to tracking 2 or more(3++) objects.

i only make just 1 tracking object source code.

then, how to add more detecting?

plz tell me how to add.

this is my code:

import cv2
import numpy as np

np col, width, row, height = -1,-1,-1,-1

-1,-1,-1,-1 frame = None

None frame2 = None frame3 = None

None inputmode1 = False inputmode2 = False

False rectangle1 = False rectangle2 = False

False trackWindow1 = None trackWindow2 = None

None roi_hist = None

None def onMouse(event, x, y, flags, param): global col, width, row, height, frame, frame2, frame3, inputmode1, inputmode2 global rectangle1, roi_hist, trackWindow1, trackWindow2, rectangle2

rectangle2

    if inputmode1:

     # 마우스클릭 이벤트
     if event == cv2.EVENT_LBUTTONDOWN:
         # 그리기 활성화
         rectangle1 = True
         col, row = x,y

     elif event == cv2.EVENT_MOUSEMOVE:

         if rectangle1:             
             frame = frame2.copy()
             cv2.rectangle(frame,(col, row), (x,y),(0,255,0),2)
             cv2.imshow('frame',frame)

     elif event == cv2.EVENT_LBUTTONUP:

         inputmode1 = False
         rectangle1 = False
         cv2.rectangle(frame,(col,row),(x,y),(0,255,0),2)
         height, width = abs(row-y),abs(col-x)
         trackWindow1 = (col, row, width, height)
         roi = frame[row:row+height, col:col+width]
         roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
         roi_hist = cv2.calcHist([roi],[0], None, [180],[0,180])
         cv2.normalize(roi_hist, roi_hist, 0 , 255, cv2.NORM_MINMAX)

 if inputmode2:

     if event == cv2.EVENT_LBUTTONDOWN:
         # 그리기 활성화
         rectangle2 = True
         col, row = x,y

     elif event == cv2.EVENT_MOUSEMOVE:
         if rectangle2:               
             frame = frame3.copy()

             cv2.rectangle(frame,(col, row), (x,y),(255,0,0),2)
             cv2.imshow('frame',frame)    
     elif event == cv2.EVENT_LBUTTONUP:           
         inputmode2 = False
         rectangle2 = False
         cv2.rectangle(frame,(col,row),(x,y),(255,0,0),2)
         height, width = abs(row-y),abs(col-x)
         trackWindow2 = (col, row, width, height)
         roi = frame[row:row+height, col:col+width]
         roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
         roi_hist = cv2.calcHist([roi],[0], None, [180],[0,180])
         cv2.normalize(roi_hist, roi_hist, 0 , 255, cv2.NORM_MINMAX)
 return

def CamShift(): global frame, frame2, frame3, inputmode1,inputmode2,trackWindow1, trackWindow2, roi_hist

roi_hist

    try:
     cap = cv2.VideoCapture(1)

 except Exception as e:
     print(e)
     return

 ret, frame = cap.read()
 cv2.namedWindow('frame')


 cv2.setMouseCallback('frame',onMouse,param=(frame,frame2, frame3)) 
 termination = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

 while True:
     ret, frame = cap.read()

     if not ret:
         break

     if trackWindow1 is not None:

         hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

         dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
         cv2.imshow('dst',dst)

         ret, trackWindow1 = cv2.CamShift(dst, trackWindow1, termination)

         pts = cv2.boxPoints(ret)
         pts = np.int0(pts)

         cv2.polylines(frame,[pts],True,(0,255,0),2)

     elif trackWindow2 is not None:

         hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

         dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
         cv2.imshow('dst',dst)

         ret, trackWindow2 = cv2.CamShift(dst, trackWindow2, termination)

         pts = cv2.boxPoints(ret)
         pts = np.int0(pts)

         cv2.polylines(frame,[pts],True,(255,0,0),2)

     cv2.imshow('frame',frame)

     k = cv2.waitKey(1)
     if k == 27:
         break

     if k == ord('1'):
         print("please select figure #1")
         inputmode1 = True

         frame2 = frame.copy()

         cv2.imshow('frame',frame)
         cv2.waitKey(0)

     if k == ord('2'):
         print("please select figure #2")
         inputmode2 = True

         frame3 = frame.copy()

         cv2.imshow('frame',frame)
         cv2.waitKey(0)       

 cap.release()
 cv2.destroyAllWindows()

CamShift()

CamShift()