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 25 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
Sanic框架安装与简单入门示例
Jul 16 Python
Python读写zip压缩文件的方法
Aug 29 Python
Python进度条的制作代码实例
Aug 31 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
浅析Python 多行匹配模式
Jul 24 Python
学python爬虫能做什么
Jul 29 Python
基于Django集成CAS实现流程详解
Nov 28 Python
基于Python实现nc批量转tif格式
Aug 14 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内存管理之谁动了我的内存
2013/06/20 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
php中OR与|| AND与&&的区别总结
2013/10/26 PHP
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
用Node提供静态文件服务的方法
2018/07/06 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
在Python中使用第三方模块的教程
2015/04/27 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Python 获取div标签中的文字实例
2018/12/20 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
tensorflow 实现数据类型转换
2020/02/17 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
社区清明节活动总结
2014/07/04 职场文书
运动会通讯稿600字
2015/07/20 职场文书
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android