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 15 Python
python计算auc指标实例
Jul 13 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
python自动化测试之如何解析excel文件
Jun 27 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
详解Django admin高级用法
Nov 06 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
pyCharm 实现关闭代码检查
Jun 09 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 Python
Python中X[:,0]和X[:,1]的用法
May 10 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常用数学函数汇总
2014/11/21 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
解析Vue.js中的组件
2018/02/02 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python文件和流(实例讲解)
2017/09/12 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
pandas数值计算与排序方法
2018/04/12 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python制作朋友圈九宫格图片
2019/11/03 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
社区端午节活动方案
2014/01/28 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
爱与责任演讲稿
2014/05/20 职场文书
趣味运动会策划方案
2014/06/02 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis