Data Science/컴퓨터비전

[python, opencv] 판별된 오브젝트가 특정 영역 내부에 있는지 판단하기(다각형 폴리곤을 이용한 마스크 만들기, 작업구역 탐지, 위험구역 탐지)

상어군 2023. 5. 30. 19:25
반응형

다양한 모양의 작업구역 등을 설정하고 이에 탐지된 오브젝트가 구역내 소속되어 있는지 판단하는 방법을 고민하던 중

폴리곤으로 mask를 만들고 and 연산을 하면 간단하다고 하여 이를 작성해본다.

 

실제 이미지 및 오브젝트 검출 부분까지 글에 가져오면 너무 분량이 많아져서,

검출된 오브젝트의 좌표값이 있다고 가정하고 간단한 예시로 진행하겠다.

 

1. 이미지

120*100짜리 이미지가 있다고 가정한다.

img_mask = np.zeros((100,120,1),dtype=np.uint8)
plt.imshow(img_mask)

 

2. 특정 영역 마스크 구역 생성(작업구역, 위험구역 등)

작업구역과 같이 사용자가 지정하고싶은 특정 구역을 나타내는 마스크를 만들어준다.

여러개의 다각형으로 다양한 구역을 표현 가능하다.

cv2.fillPoly를 사용하면 내부가 찬 다각형을 그릴 수 있다.

poly_pixel1 = np.array([(10,10),(80,10),(80,20),(30,20),(30,50),(10,50)])
poly_pixel2 = np.array([(80,90),(110,60),(110,90)])
fill_mask = cv2.fillPoly(img_mask,[poly_pixel1,poly_pixel2],1)

plt.imshow(fill_mask)

보라색과 노란색으로 보이지만, 보라색은 0 노란색은 1로 채워져있다.

 

3. 오브젝트 검출 및 오브젝트 마스크 생성

검출 모델에서 특정 오브젝트의 좌표를 반환하였다고 가정하고,

해당 좌료를 기반으로 오브젝트 마스크를 생성한다.

obj_mask = np.zeros((100,120,1),dtype=np.uint8)
# 검출된 오브젝트1 좌표
x1,y1,x2,y2 = 40,40,50,50
obj_mask[y1:y2,x1:x2] = 1

# 검출된 오브젝트2 좌표
x1,y1,x2,y2 = 90,80,100,90
obj_mask[y1:y2,x1:x2] = 1

plt.imshow(obj_mask)

 

4. AND 연산

마스크 두개를 활용하여 AND 연산을 진행해준다.

자연스럽게 특정 구역이면서도 오브젝트가 검출된 곳만 1로 계산되어서 나온다.

com_img = cv2.bitwise_and(fill_mask,obj_mask)
plt.imshow(com_img)

반응형