컴퓨터 비전

Vehicle Counting

도그사운드 2023. 10. 15. 22:02

 

동영상을 영화 및 TV로 보낸다.

색연필 아이콘을 클릭해서 비디오에서 사진저장을 클릭해서 프레임을 저장한다.

 

그림판에서 감지할 라인을 그려준후 위치를 마우스포인트를 위치에 놓으면 좌표가 좌측 하단에 나온다.

line =[ (158,501), (1061, 504)]

이러한 감지라인을 만들 수 있다.

object_counter={}

dictionary를 생성

 

Bbox의 bottom center가 저 라인을 intersect하는 경우를 카운트하면 된다.

 

두 직선의 교차는 아래의 함수로 확인 가능하다

def ccw(A, B, C):
    return (C.y-A.y) * (B.x-A.x) > (B.y-A.y) * (C.x-A.x)
def intersect(A, B, C, D):
    return ccw(A,C,D) != ccw(B,C,D) and ccw(A,B,C) != ccw(A,B,D)

다음의 코드가 들어간다.

각기 객체에 대한 ID가 있었던 큐에 만약 인터섹트가 발생하면 아이디가 2개 이상이 된다.

data_deque[id].appendleft(center)
if len(data_deque) > 2:
    if intersect(data_deque[id][0], data_deque[id][1], line[0], line[1]):
        cv2.line(img, line[0], line[1], (255,255,255),3)

        if obj_name is not object_counter:
            object_counter=1
        else:
            object_counter+=1

감지선으로 들어오는 차량과 나가는 차량을 구분하는 방법으로 상행과 하행을 나눌 수 있다.

object_count={}

object_count1={}

형태로 dict를 구성해 줘야 한다.

 

큐에 잡히는 bottom center 포인트가 어느 방향에서 왔는지에 따라 포인트의 위치가 다를 수 밖에 없다.

따라서 포인트의 크기를 비교함으로써 방향을 알게 된다.

def get_direction(point1, point2):

     direction_str=""

     if point[1] > point[2]:

          direction_str +="south"

     elseif poin[1] < point[2]:

          direction_str +="north"

 

point[0]을 사용해서 비교한다면 east, west가 구분 가능해진다.

그러나 감지선 근처에서 차선변경이 이루어진다면 어떻게 할까?

도로 방향이 정해져 있다면 상관이 없을 것이고, 예를 들어 일방향 도로

그러나 교차로라면 감지선이 2개 이상이 있어야 할 것이다.

 

사업단에서 개발한 모델은 감지선 대신 감지구역을 설정되어 있다. 

감지구역 형태로 설계한 이유는 bottom center 포인트가 감지선을 넘어버리는 경우가 있다고 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'컴퓨터 비전' 카테고리의 다른 글

Python 인코딩 에러 및 기타 에러  (0) 2023.11.03
Image Segmentation 코딩  (1) 2023.10.18
YOLO 트레이닝, roboflow  (0) 2023.10.09
YOLOv8 실행  (1) 2023.10.09
Jaccard index  (0) 2023.10.08