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中的__future__模块
Apr 27 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
Python零基础入门学习之输入与输出
Apr 03 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
详解Python3 pandas.merge用法
Sep 05 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 Python
使用gunicorn部署django项目的问题
Dec 30 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
mysql 全文搜索 技巧
2007/04/27 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
ES6的新特性概览
2016/03/10 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
js初始化验证实例详解
2016/11/26 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
初步讲解Python中的元组概念
2015/05/21 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
python实现K最近邻算法
2018/01/29 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
Python面向对象之Web静态服务器
2019/09/03 Python
Python requests模块cookie实例解析
2020/04/14 Python
几个Shell Script面试题
2014/04/18 面试题
企业人事任命书
2014/06/05 职场文书
产品委托授权书范本
2014/09/16 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
一行Python命令实现批量加水印
2022/04/07 Python
Python 匹配文本并在其上一行追加文本
2022/05/11 Python