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 字符串操作方法大全
Mar 11 Python
Python字符串处理实例详解
May 18 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
postman和python mock测试过程图解
Feb 22 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
python实现批量转换图片为黑白
Jun 16 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
python 带时区的日期格式化操作
Oct 23 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 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新手上路(五)
2006/10/09 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
innerText 使用示例
2014/01/23 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
django框架如何集成celery进行开发
2017/05/24 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python面试题之列表声明实例分析
2019/07/08 Python
django云端留言板实例详解
2019/07/22 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
.net面试题
2016/09/17 面试题
党员的自我评价范文
2014/01/02 职场文书
大学同学会活动方案
2014/08/20 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
离婚律师函范本
2015/05/27 职场文书
开网店计划分析
2019/07/30 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers
MySQL查询日期时间
2022/05/15 MySQL