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 相关文章推荐
在Django的URLconf中使用命名组的方法
Jul 18 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
Python3几个常见问题的处理方法
Feb 26 Python
Python语法分析之字符串格式化
Jun 13 Python
Python转换时间的图文方法
Jul 01 Python
python中count函数简单用法
Jan 05 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 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
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
让Python代码更快运行的5种方法
2015/06/21 Python
详解Python爬虫的基本写法
2016/01/08 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
对Django url的几种使用方式详解
2019/08/06 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
记者岗位职责
2014/01/06 职场文书
满月酒答谢词
2014/01/14 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
师德建设实施方案
2014/03/21 职场文书
大专学生求职信
2014/07/04 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2015年资料员工作总结
2015/04/25 职场文书
八年级数学教学反思
2016/02/17 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS