python opencv实现图片旋转矩形分割


Posted in Python onJuly 26, 2018

有时候需要对有角度的矩形框内图像从原图片中分割出来。这里的程序思想是,先将图片进行矩形角度的旋转,使有角度的矩形处于水平状态后,根据原来坐标分割图片。
参考:python opencv实现旋转矩形框裁减功能

修改原来的程序:

1.旋转函数的输入仅为矩形的四点坐标
2.角度由公式计算出来
3.矩形四点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('\n| ',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)

原带角度的矩形框:

python opencv实现图片旋转矩形分割

旋转矩形框:

python opencv实现图片旋转矩形分割

分割:

python opencv实现图片旋转矩形分割

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用Decorator来简化元编程的教程
Apr 13 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python学习入门之区块链详解
Jul 25 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
python如何实现内容写在图片上
Mar 23 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
python中有关时间日期格式转换问题
Dec 25 Python
Python request操作步骤及代码实例
Apr 13 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 Python
Flask之flask-session的具体使用
Jul 26 #Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 #Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 #Python
详解Django中间件的5种自定义方法
Jul 26 #Python
python opencv实现切变换 不裁减图片
Jul 26 #Python
Flask之flask-script模块使用
Jul 26 #Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 #Python
You might like
php通过COM类调用组件的实现代码
2012/01/11 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php实现点击可刷新验证码
2015/11/07 PHP
php的debug相关函数用法示例
2016/07/11 PHP
Laravel实现表单提交
2017/05/07 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
原生js轮播特效
2017/05/18 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Python中函数的返回值示例浅析
2019/08/28 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
如何基于python实现不邻接植花
2020/05/01 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
进修护士自我鉴定
2013/10/14 职场文书
技术负责人任命书
2014/06/05 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
2015年教师节活动总结
2015/03/20 职场文书
热爱劳动主题班会
2015/08/14 职场文书
婚礼答谢词范文
2015/09/29 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书