위 그림은 요구 사항을 설명합니다.
그려진 다각형을 기준으로 마스크(즉 흰색 영역) 이미지를 생성하는 것이 목표이며 생성된 이미지의 크기는 원본 이미지의 크기와 일치해야 하며 해당 위치에 마스크가 생성됩니다.
처리 방법:
1. 그려진 다각형의 각 꼭지점 좌표를 읽습니다. 필요한 것은 이미지의 픽셀 좌표입니다.
2. 후속 사용을 위해 원본 그림의 크기와 일치하는 0 또는 1의 그림을 생성합니다.
3. cv2 라이브러리에 따르면 fillPoly 함수는 이미지의 해당 다각형 위치를 모두 0 또는 모두 1로 채웁니다.
4. 채운 후 마스크된 이미지 cv2.imwrite를 출력합니다.
이상이 기본적인 과정이고, 파이썬 코드가 나올 준비가 되어있습니다.
참고할 문제:
이미지에 출력할 다각형 마스크가 여러 개 있을 수 있습니다. 동일한 이미지에서 마스크 출력을 생성하려면 다각형을 횡단하는 데 주의하세요.
이 기간 동안 내가 겪은 문제는 다음과 같습니다.
opencv에는 다각형 영역을 픽셀로 채울 수 있는 두 가지 함수, 즉 cv2.fillConvexPoly() 및 cv2.fillPoly()가 포함되어 있습니다. 두 함수는 약간 다르기 때문에 생성된 결과의 효과에 차이가 있습니다. 왼쪽은 cv2.fillConvexPoly입니다. (
) 의 출력 결과, 오른쪽은 cv2.fillPoly()의 출력 결과입니다.
왼쪽의 이미지는 다각형의 가장자리를 정확하게 묘사할 수 있지만 다각형 내부의 일부 영역은 픽셀을 정확하게 채울 수 없어 마스크 생성이 실패하는 반면 오른쪽의 다른 함수의 생성 효과는 완벽하게 나타나는 것을 볼 수 있습니다
. 다각형의 면적과 일치합니다.
두 가지 함수에 대해: (정보를 검색한 후 메모하겠습니다.)
1. cv2.fillConvexPoly() 함수는 볼록 다각형을 채우는 데 사용할 수 있으며 볼록 다각형의 꼭지점만 제공하면 됩니다.
img = np.zeros((1080, 1920, 3), np.uint8)
triangle = np.array([[0, 0], [1500, 800], [500, 400]])
cv2.fillConvexPoly(img, triangle, (255, 255, 255))
cv2.imwrite('./1.jpg',img)
2. cv2.fillPoly() 함수는 모든 모양의 그래픽을 채우는 데 사용할 수 있습니다. 다각형을 그리는 데 사용할 수 있습니다. 작업에서는 곡선을 근사화하기 위해 많은 가장자리를 사용하는 경우가 많습니다. cv2.fillPoly() 함수는 여러 개를 채울 수 있습니다. 한 번에 모양을 만들고 그래픽을 만듭니다.
여러 영역을 입력하려면 "[ ]"를 추가하세요.
img = np.zeros((1080, 1920, 3), np.uint8)
area1 = np.array([[250, 200], [300, 100], [750, 800], [100, 1000]])
area2 = np.array([[1000, 200], [1500, 200], [1500, 400], [1000, 400]])
cv2.fillPoly(img, [area1, area2], (255, 255, 255))
cv2.imwrite('./2.jpg',img)
반투명 채우기:
때때로 반투명 채우기 효과를 원할 경우 cv2.addWeighted 메소드를 사용할 수 있습니다.
alpha = 0.7
beta = 1-alpha
gamma = 0
img_add = cv2.addWeighted(img1, alpha,img2, beta, gamma)
cv2.imwrite('final ret.jpg',img_add)
cv2.imshow('img_add',img_add)
if cv2.waitKey(500) and 0xff == ord('q'):
cv2.destroyAllWindows()