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 相关文章推荐
python3实现短网址和数字相互转换的方法
Apr 28 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
Python基础之函数的定义与使用示例
Mar 23 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
python实现图片中文字分割效果
Jul 22 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
使用python绘制横竖条形图
Apr 21 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的FTP学习(四)
2006/10/09 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
js停止输出代码
2008/07/20 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
python中二维阵列的变换实例
2014/10/09 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
存储过程和函数的区别
2013/05/28 面试题
Linux如何为某个操作添加别名
2013/03/01 面试题
前台文员职责范本
2014/03/07 职场文书
好的旅游活动方案
2014/08/19 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
环卫工作个人总结
2015/03/04 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫