python 네 개의 좌표 점 은 그림 영역 최소 외 접 사각형 을 재단 합 니 다.

그림 재단 작업 에서 opencv 와 pillow 두 라 이브 러 리 는 모두 해당 하 는 함 수 를 가지 고 있 습 니 다.그러나 이 두 라 이브 러 리 의 함 수 는 그림 과 평행 하 는 사각형 만 재단 할 수 있 습 니 다.목표 의 최소 외 접 사각형 을 재단 하려 면 어떻게 해 야 합 니까?다음 과 같다.

구체 적 으로 이 문 제 를 처리 하 는 사고방식 은 다음 과 같다.
  • 최소 외 접 사각형 의 네 개의 점 을 계산 하 는 좌표,회전 각도
  • 원 이미 지 를 회전 시 키 고 회전 각 도 는 최소 외 접 사각형 의 각도
  • 네 개의 점 의 좌 표를 매 핑 하여 회전 한 이미지 의 네 개의 점 의 좌 표를 구하 십시오
  • 이 네 가지 점 을 이용 하여 그림 을 재단 합 니 다
  • 그림 원 도 는 다음 과 같 습 니 다.

    1 이 구역 의 최소 외 접 사각형 을 구하 고 외 접 사각형 의 네 개의 점 의 좌표 와 회전 각 도 를 얻는다.
    
    rect = cv2.minAreaRect(self.contours[0])#rect [(    x  ,    y  ),(   ,   ),    ]
    box_origin = cv2.boxPoints(rect)#box_origin [(x0,y0),(x1,y1),(x2,y2),(x3,y3)]

    2.원 이미 지 를 회전 시 키 고 회전 각 도 는 최소 외 접 사각형 의 각도 입 니 다.회전 후 목표 구역 이 이미지 밖 에 있 는 것 을 방지 하기 때문에 저 는 이미지 크기 를 원래 의 2 배로 확대 합 니 다.
    
    M = cv2.getRotationMatrix2D(rect[0],rect[2],1)
    dst = cv2.warpAffine(rotateimg,M,(2*rotateimg.shape[0],2*rotateimg.shape[1]))

    3 원래 네 개의 점 의 좌 표를 비 추어 회전 후의 구역 에 비 추어 새로운 네 개의 점 의 좌 표를 얻는다.
    
    #     
    def Nrotate(angle,valuex,valuey,pointx,pointy):
          angle = (angle/180)*math.pi
          valuex = np.array(valuex)
          valuey = np.array(valuey)
          nRotatex = (valuex-pointx)*math.cos(angle) - (valuey-pointy)*math.sin(angle) + pointx
          nRotatey = (valuex-pointx)*math.sin(angle) + (valuey-pointy)*math.cos(angle) + pointy
          return (nRotatex, nRotatey)
    #     
    def Srotate(angle,valuex,valuey,pointx,pointy):
          angle = (angle/180)*math.pi
          valuex = np.array(valuex)
          valuey = np.array(valuey)
          sRotatex = (valuex-pointx)*math.cos(angle) + (valuey-pointy)*math.sin(angle) + pointx
          sRotatey = (valuey-pointy)*math.cos(angle) - (valuex-pointx)*math.sin(angle) + pointy
          return (sRotatex,sRotatey)
    #       
    def rotatecordiate(angle,rectboxs,pointx,pointy):
          output = []
          for rectbox in rectboxs:
            if angle>0:
              output.append(Srotate(angle,rectbox[0],rectbox[1],pointx,pointy))
            else:
              output.append(Nrotate(-angle,rectbox[0],rectbox[1],pointx,pointy))
          return output
    box = rotatecordiate(rect[2],box_origin,rect[0][0],rect[0][1])
    4.네 개의 점 좌 표를 이용 하여 재단 한다.예 를 들 어 2 중의 그림 에서 보 듯 이 그림 은 회전 을 거 친 후에 이미 그림 과 회전 각 이 없 는 이미지 로 변 했다.실험 을 통 해 회전 한 좌 표를 관찰 한 후에 작은 차이 가 있 지만 오 차 는 이미 1000 점,심지어 만 점 정도 에 있 기 때문에 우리 가 재단 하여 만 든 영향 은 무시 할 수 있다.
    
    def imagecrop(image,box):
          xs = [x[1] for x in box]
          ys = [x[0] for x in box]
          print(xs)
          print(min(xs),max(xs),min(ys),max(ys))
          cropimage = image[min(xs):max(xs),min(ys):max(ys)]
          print(cropimage.shape)
          cv2.imwrite('cropimage.png',cropimage)
          return cropimage
    imagecrop(dst,np.int0(box))

    여기에 4 개의 좌표 점 을 이용 하여 그림 을 재단 하 는 작업 이 완료 되 었 습 니 다.
    여기 서 python 네 개의 좌표 점 이 그림 구역 의 최소 외 접 사각형 을 재단 하 는 것 에 관 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 python 그림 좌표 재단 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 를 많이 응원 해 주세요!

    좋은 웹페이지 즐겨찾기