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的函数嵌套的使用方法
Jan 24 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
实例讲解Python3中abs()函数
Feb 19 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
Python使用贪婪算法解决问题
Oct 22 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
Python更新所有已安装包的操作
Feb 13 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
python有几个版本
Jun 17 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 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+mysql留言本源码
2009/11/11 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
NodeJS实现视频转码的示例代码
2017/11/18 NodeJs
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
JS回调函数深入理解
2019/10/16 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python线程同步的实现代码
2018/10/03 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
比利时家具购买网站:Home24
2019/01/03 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
应用电子技术专业个人求职信
2013/09/21 职场文书
中学生运动会口号
2014/06/07 职场文书
出售房屋协议书范本
2014/10/06 职场文书
展览会邀请函
2015/02/02 职场文书
社区节水倡议书
2015/04/29 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技