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 将字符串转换成字典dict
Mar 24 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
python验证码识别教程之滑动验证码
Jun 04 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
基于plt.title无法显示中文的快速解决
May 16 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 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安装攻略:常见问题解答(一)
2006/10/09 PHP
php过滤危险html代码
2008/08/18 PHP
php smarty函数扩展
2010/03/15 PHP
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
jupyter 添加不同内核的操作
2021/02/06 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2014年督导工作总结
2014/11/19 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python