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集合类型用法分析
Apr 08 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
Python+selenium实现截图图片并保存截取的图片
Jan 05 Python
利用pandas读取中文数据集的方法
Jul 25 Python
Python global全局变量函数详解
Sep 18 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
python三方库之requests的快速上手
Mar 04 Python
简单了解Python生成器是什么
Jul 02 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
Python Map 函数的使用
Aug 28 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
定义php常量的详解
2013/06/09 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python中Collection的使用小技巧
2014/08/18 Python
Python文件的读写和异常代码示例
2017/10/31 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python telnet登陆功能实现代码
2020/04/16 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
python 下载文件的几种方法汇总
2021/01/06 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
法学专业自我鉴定
2014/02/05 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android