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中RawString的理解介绍
Jul 07 Python
分分钟入门python语言
Mar 20 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
Django框架实现分页显示内容的方法详解
May 10 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
django admin 添加自定义链接方式
Mar 11 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
Apr 03 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
python tqdm库的使用
Nov 30 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 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中读取和写入WORD文档的代码
2008/04/09 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
python django集成cas验证系统
2014/07/14 Python
python中int与str互转方法
2018/07/02 Python
python读写LMDB文件的方法
2018/07/02 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
python递归函数用法详解
2020/10/26 Python
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
《去年的树》教学反思
2014/04/11 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
内乡县衙导游词
2015/02/05 职场文书
2015年幼师工作总结
2015/04/28 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
Python实现拼音转换
2021/06/07 Python
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL