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 实现归并排序算法
Jun 05 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
Python中的多重装饰器
Apr 11 Python
python自定义类并使用的方法
May 07 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
详解Python中where()函数的用法
Mar 27 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
关于python爬虫应用urllib库作用分析
Sep 04 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学习笔记(三)操作符与控制结构
2011/08/06 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
微信小程序登录态控制深入分析
2017/04/12 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
python os.path模块常用方法实例详解
2018/09/16 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
主题班会演讲稿
2014/05/22 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
2015年个人思想总结
2015/03/09 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
如何理解PHP核心特性命名空间
2021/05/28 PHP
如何使用SQL Server语句创建表
2022/04/12 SQL Server