python opencv实现图片旋转矩形分割
作者:Imcy 发布时间:2022-01-25 06:23:24
标签:python,opencv,图片旋转,分割
有时候需要对有角度的矩形框内图像从原图片中分割出来。这里的程序思想是,先将图片进行矩形角度的旋转,使有角度的矩形处于水平状态后,根据原来坐标分割图片。
参考: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)
原带角度的矩形框:
旋转矩形框:
分割:
来源:https://blog.csdn.net/u013948010/article/details/78605043
0
投稿
猜你喜欢
- 主要使用json模块,直接导入import json即可。小例子如下:#coding=UTF-8 import json info={} i
- 需要转载的小伙伴转载后请注明转载的地址需要用到的库from bs4 import BeautifulSoupimport requestsi
- 写文的原因学习 Python 的过程中,经常会使用 pip 命令去安装第三方模块,但细细琢磨下来,我真的掌握这款工具了吗?本文为你全面揭示一
- 对于什么是好设计,一万个人那里至少有一万零一个答案。每个人都有自己的答案,有的人还不止一个答案。老师说,一定要在设计里灌注自己的思想,有了自
- 其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问起这个多
- 使用python爬虫库requests,urllib爬取今日头条街拍美图代码均有注释import re,json,requests,osfr
- 前言我们知道在这个互联网时代,评论已经在我们的生活到处可见,评论区里面的信息是一个非常有趣和有争议的地方。我们今天,就来获取某技术平台的评论
- 一、抓取全部评论吾的这篇文章,有 1022 次评论,一条条看,吾看不过来,于是想到 Python 词云,提取关键词,倒也是一桩趣
- 介绍百度aip模块是用于实现百度云与用户接口,简单来说就是使用百度云所拥有的人工智能模块。模块使用pip install baidu-aip
- 问题:在论坛发表回复时出现“The table is full”的提示,字面意义上是数据表已满的意思。因为很少有开发者遭遇单一表超过4G的情
- Python注释python中单行注释采用 # 开头。python 中多行注释使用三个单引号(''')或三个双引号(
- 本文实例讲述了Python有序查找算法之二分法。分享给大家供大家参考,具体如下:二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的
- 本文实例讲述了Python3.5变量、数据结构、条件和循环语句、break与continue语句。分享给大家供大家参考,具体如下:1、变量:
- 最近需要将csv文件转成DataFrame并以json的形式展示到前台,故需要用到Dataframe的to_json方法to_json方法默
- 本文实例讲述了Zend Framework教程之资源(Resources)用法。分享给大家供大家参考,具体如下:Zend_Applicati
- 1、爬取目标网站:业绩预告_数据中心_同花顺财经(ps:headers不会设置的可以看这篇:Python 用requests.get获取网页
- python为main方法传参执行python脚本的时候,想给main方法传入参数的例子#!/usr/bin/env python# -*-
- 效果演示开发工具Python版本: 3.6.4相关模块:pygame模块;PyQt5模块;以及一些Python自带的模块。环境搭建安装Pyt
- 延时摄影(英语:Time-lapse photography)是以一种较低的帧率拍 下图像或者视频,然后用正常或者较快的速率播放画面的摄影技
- 阅读上一篇:javascript面向对象编程(一)[javascript模拟传统OOP]javascript是一种非常灵活的语言,它的灵活度