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中获取对象信息的方法
Apr 27 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Python2与Python3的区别详解
Feb 09 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 09 Python
python实现会员信息管理系统(List)
Mar 18 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 class类的用法详细总结
2013/10/17 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
JS实现多选框的操作
2020/06/24 Javascript
Python中方法链的使用方法
2016/02/23 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
python中退出多层循环的方法
2018/11/27 Python
PyTorch中的Variable变量详解
2020/01/07 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
中层干部培训方案
2014/06/16 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫
2022微信温控新功能上线
2022/05/09 数码科技