-
[python, opencv] 판별된 오브젝트가 특정 영역 내부에 있는지 판단하기(다각형 폴리곤을 이용한 마스크 만들기, 작업구역 탐지, 위험구역 탐지)Data Science/컴퓨터비전 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)
반응형'Data Science > 컴퓨터비전' 카테고리의 다른 글
Diffusion Model 기본 개념 공부하기 (3) 2024.03.17 [opencv/python] 동영상 읽어와서 처리 후 다시 동영상으로 만들기 (0) 2023.06.18 [Python, opencv] 다각형 그리기 코드 구현(cv2.polylines) (0) 2023.05.30