python实现在图片上画特定大小角度矩形框


Posted in Python onOctober 24, 2018

做图像识别的时候需要在图片中画出特定大小和角度的矩形框,自己写了一个函数,给定的输入是图片名称,矩形框的位置坐标,长宽和角度,直接输出画好矩形框的图片。

主要思想是先根据x,y坐标和长宽得到矩形,然后通过数学计算得到旋转angle角度后的新矩形框的四个顶点位置坐标,再利用draw.line()函数画出来。

import math

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image, ImageDraw


def draw(filename,result):
  img = Image.open(filename)
  w,h=img.size
  draw = ImageDraw.Draw(img)
  result=np.array(result)
  x=result[0][0]
  y=result[0][1]
  angle=result[0][2]
  height=result[0][3]
  width=result[0][4]

  anglePi = -angle*math.pi/180.0
  cosA = math.cos(anglePi)
  sinA = math.sin(anglePi)

  x1=x-0.5*width
  y1=y-0.5*height

  x0=x+0.5*width
  y0=y1

  x2=x1
  y2=y+0.5*height

  x3=x0
  y3=y2

  x0n= (x0 -x)*cosA -(y0 - y)*sinA + x
  y0n = (x0-x)*sinA + (y0 - y)*cosA + y

  x1n= (x1 -x)*cosA -(y1 - y)*sinA + x
  y1n = (x1-x)*sinA + (y1 - y)*cosA + y

  x2n= (x2 -x)*cosA -(y2 - y)*sinA + x
  y2n = (x2-x)*sinA + (y2 - y)*cosA + y

  x3n= (x3 -x)*cosA -(y3 - y)*sinA + x
  y3n = (x3-x)*sinA + (y3 - y)*cosA + y


  draw.line([(x0n, y0n),(x1n, y1n)], fill=(0, 0, 255))
  draw.line([(x1n, y1n),(x2n, y2n)], fill=(255, 0, 0))
  draw.line([(x2n, y2n),(x3n, y3n)],fill= (0,0,255))
  draw.line([(x0n, y0n), (x3n, y3n)],fill=(255,0,0))

  plt.imshow(img)
  plt.show()

改写成c++

由于c++程序也需要用到这个程序,改写一下

void CopentestDlg::OnBnClickedAnaly()
{
  CString x,y,angle,width;
  float xRaw[4], yRaw[4];
  float xNew[4], yNew[4];
  float height = 33;
  if (imageCut==NULL) {
    AfxMessageBox(_T("未打开图片不能分析"));
    return;
  }
  GetDlgItem(IDC_EX)->GetWindowText(x);
  GetDlgItem(IDC_EY)->GetWindowText(y);
  GetDlgItem(IDC_ANGLE)->GetWindowText(angle);
  GetDlgItem(IDC_WIDTH)->GetWindowText(width);
  float xf = _tstof(x); //将Cstring转成float类型
  float yf = _tstof(y);
  float widthf= _tstof(width);
  float anglef= _tstof(angle);

  xRaw[1] = xf - 0.5*widthf;
  yRaw[1] = yf - 0.5*height;

  xRaw[0] = xf + 0.5*widthf;
  yRaw[0] = yRaw[1];

  xRaw[2] = xRaw[1];
  yRaw[2] = yf + 0.5*height;

  xRaw[3] = xRaw[0];
  yRaw[3] = yRaw[2];

  float anglePi = -anglef*pi / 180.0;
  float cosA = cos(anglePi);
  float sinA = sin(anglePi);

  xNew[0] = (xRaw[0] - xf)*cosA - (yRaw[0] - yf)*sinA + xf;
  yNew[0] = (xRaw[0] - xf)*sinA + (yRaw[0] - yf)*cosA + yf;

  xNew[1] = (xRaw[1] - xf)*cosA - (yRaw[1] - yf)*sinA + xf;
  yNew[1] = (xRaw[1] - xf)*sinA + (yRaw[1] - yf)*cosA + yf;

  xNew[2] = (xRaw[2] - xf)*cosA - (yRaw[2] - yf)*sinA + xf;
  yNew[2] = (xRaw[2] - xf)*sinA + (yRaw[2] - yf)*cosA + yf;

  xNew[3] = (xRaw[3] - xf)*cosA - (yRaw[3] - yf)*sinA + xf;
  yNew[3] = (xRaw[3] - xf)*sinA + (yRaw[3] - yf)*cosA + yf;

  cvLine(imageCut, cvPoint(xNew[0], yNew[0]), cvPoint(xNew[1], yNew[1]), cvScalar(0, 0, 255), 3);
  cvLine(imageCut, cvPoint(xNew[1], yNew[1]), cvPoint(xNew[2], yNew[2]), cvScalar(255, 0, 0), 3);
  cvLine(imageCut, cvPoint(xNew[2], yNew[2]), cvPoint(xNew[3], yNew[3]), cvScalar(0, 0, 255), 3);
  cvLine(imageCut, cvPoint(xNew[0], yNew[0]), cvPoint(xNew[3], yNew[3]), cvScalar(255, 0, 0), 3);

  DrawPicToHDC(imageCut, IDC_Cut);
  pEdit->ReplaceSel(_T("图片已修改\r\n"));
}

效果图

python实现在图片上画特定大小角度矩形框

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
布同自制Python函数帮助查询小工具
Mar 13 Python
跟老齐学Python之字典,你还记得吗?
Sep 20 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
Python之pymysql的使用小结
Jul 01 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 #Python
python实现图片筛选程序
Oct 24 #Python
用pycharm开发django项目示例代码
Oct 24 #Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 #Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 #Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 #Python
Python实现按逗号分隔列表的方法
Oct 23 #Python
You might like
php定时计划任务的实现方法详解
2013/06/06 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
PHP session 会话处理函数
2016/06/06 PHP
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
python批量同步web服务器代码核心程序
2014/09/01 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
Python中存取文件的4种不同操作
2018/07/02 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
Python FFT合成波形的实例
2019/12/04 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
Python作用域与名字空间原理详解
2020/03/21 Python
Python-split()函数实例用法讲解
2020/12/18 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
校园环保广播稿(3篇)
2014/09/15 职场文书
助学贷款贫困证明
2014/09/23 职场文书
初中教师个人总结
2015/02/10 职场文书
小学语文教师研修日志
2015/11/13 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
JavaScript实例 ODO List分析
2022/01/22 Javascript
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python