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中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
Python调用C++,通过Pybind11制作Python接口
Oct 16 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
Python list运算操作代码实例解析
Jan 20 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 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类中Static方法效率测试代码
2010/10/17 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
js文字滚动停顿效果代码
2008/06/28 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
python中round函数保留两位小数的方法
2020/12/04 Python
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
季度思想汇报
2014/01/01 职场文书
北京大学自荐信范文
2014/01/28 职场文书
连带责任保证书
2014/04/29 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
停车位租赁协议书
2014/09/24 职场文书
2015入党自荐书范文
2015/03/05 职场文书
员工福利申请报告
2015/05/15 职场文书
《我的长生果》教学反思
2016/02/20 职场文书