python opencv 그림 회전 사각형 분할 실현

각도 가 있 는 사각형 상자 안의 그림 을 원래 그림 에서 분리 해 야 할 때 가 있다.여기 서 프로그램 사상 은 먼저 그림 을 사각형 각도 로 회전 시 켜 각도 가 있 는 사각형 을 수평 상태 에 놓 은 후에 원래 의 좌표 에 따라 그림 을 나 누 는 것 이다.
참고:python opencv 회전 사각형 상자 감축 기능 실현
원래 프로그램 수정:
1.회전 함수 의 입력 은 사각형 의 4 점 좌표 에 불과 합 니 다.
2.각 도 는 공식 으로 계산한다
3.사각형 4 시 pt1,pt2,pt3,pt4 는 txt 파일 로 읽 습 니 다.
4.회전 프로그램 에 서 는 시계 방향 과 시계 반대 방향 및 직사각형 상자 가 뒤 집 히 는 문제 도 처리 했다.
코드:

# -*- coding:utf-8 -*-
import cv2
from math import *
import numpy as np
import time,math
import os
import re

'''       '''
def rotate(
    img, #   
    pt1, pt2, pt3, pt4
):
  print pt1,pt2,pt3,pt4
  withRect = math.sqrt((pt4[0] - pt1[0]) ** 2 + (pt4[1] - pt1[1]) ** 2) #       
  heightRect = math.sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) **2)
  print withRect,heightRect
  angle = acos((pt4[0] - pt1[0]) / withRect) * (180 / math.pi) #        
  print angle

  if pt4[1]>pt1[1]:
    print "     "
  else:
    print "     "
    angle=-angle

  height = img.shape[0] #       
  width = img.shape[1]  #       
  rotateMat = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1) #  angle      
  heightNew = int(width * fabs(sin(radians(angle))) + height * fabs(cos(radians(angle))))
  widthNew = int(height * fabs(sin(radians(angle))) + width * fabs(cos(radians(angle))))

  rotateMat[0, 2] += (widthNew - width) / 2
  rotateMat[1, 2] += (heightNew - height) / 2
  imgRotation = cv2.warpAffine(img, rotateMat, (widthNew, heightNew), borderValue=(255, 255, 255))
  cv2.imshow('rotateImg2', imgRotation)
  cv2.waitKey(0)

  #           
  [[pt1[0]], [pt1[1]]] = np.dot(rotateMat, np.array([[pt1[0]], [pt1[1]], [1]]))
  [[pt3[0]], [pt3[1]]] = np.dot(rotateMat, np.array([[pt3[0]], [pt3[1]], [1]]))
  [[pt2[0]], [pt2[1]]] = np.dot(rotateMat, np.array([[pt2[0]], [pt2[1]], [1]]))
  [[pt4[0]], [pt4[1]]] = np.dot(rotateMat, np.array([[pt4[0]], [pt4[1]], [1]]))

  #        
  if pt2[1]>pt4[1]:
    pt2[1],pt4[1]=pt4[1],pt2[1]
  if pt1[0]>pt3[0]:
    pt1[0],pt3[0]=pt3[0],pt1[0]

  imgOut = imgRotation[int(pt2[1]):int(pt4[1]), int(pt1[0]):int(pt3[0])]
  cv2.imshow("imgOut", imgOut) #           
  cv2.waitKey(0)
  return imgRotation # rotated image


#         
def drawRect(img,pt1,pt2,pt3,pt4,color,lineWidth):
  cv2.line(img, pt1, pt2, color, lineWidth)
  cv2.line(img, pt2, pt3, color, lineWidth)
  cv2.line(img, pt3, pt4, color, lineWidth)
  cv2.line(img, pt1, pt4, color, lineWidth)

#          
def ReadTxt(directory,imageName,last):
  fileTxt=directory+"//rawLabel//"+imageName[:7]+last # txt   
  getTxt=open(fileTxt, 'r') #   txt  
  lines = getTxt.readlines()
  length=len(lines)
  for i in range(0,length,4):
    pt2=list(map(float,lines[i].split(' ')[:2]))
    pt1=list(map(float,lines[i+1].split(' ')[:2]))
    pt4=list(map(float,lines[i+2].split(' ')[:2]))
    pt3=list(map(float,re.split('
| ',lines[i+3])[:2])) # float int pt2=list(map(int,pt2)) pt1=list(map(int,pt1)) pt4=list(map(int,pt4)) pt3=list(map(int,pt3)) imgSrc = cv2.imread(imageName) drawRect(imgSrc, tuple(pt1),tuple(pt2),tuple(pt3),tuple(pt4), (0, 0, 255), 2) cv2.imshow("img", imgSrc) cv2.waitKey(0) rotate(imgSrc,pt1,pt2,pt3,pt4) if __name__=="__main__": directory = "G://grasp//grapCode//trainImage//jpg//4" last = 'cneg.txt' imageName="pcd0247r.png" ReadTxt(directory,imageName,last)
원본 각도 의 사각형 상자:

회전 사각형 상자:

분할:
这里写图片描述
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기