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中生成器和yield语句的用法详解
Apr 17 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Flask解决跨域的问题示例代码
Feb 12 Python
Python切片操作实例分析
Mar 16 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
Python使用folium excel绘制point
Jan 03 Python
python读取图片任意范围区域
Jan 23 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
Python实现冒泡排序算法的完整实例
Nov 04 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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
Python语言描述随机梯度下降法
2018/01/04 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
python求最大连续子数组的和
2018/07/07 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
大学生找工作推荐信范文
2013/11/28 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
mysql数据库实现设置字段长度
2022/06/10 MySQL