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使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
Python进阶篇之字典操作总结
Nov 16 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
PyQt5每天必学之布局管理
Apr 19 Python
python3.5基于TCP实现文件传输
Mar 20 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python构造函数init实例方法解析
Jan 19 Python
Python while循环使用else语句代码实例
Feb 07 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
Django URL参数Template反向解析
Nov 24 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 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去除重复字的实现代码
2011/09/16 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
php数组分页实现方法
2016/04/30 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
thinkphp分页集成实例
2017/07/24 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
python读写二进制文件的方法
2015/05/09 Python
python自定义解析简单xml格式文件的方法
2015/05/11 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Python 发送邮件方法总结
2020/08/10 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
美国时尚在线:Showpo
2017/09/08 全球购物
单位门卫岗位职责
2013/12/20 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
中小学生学籍证明
2014/10/25 职场文书
2014年质检员工作总结
2014/11/18 职场文书
教师素质教育心得体会
2016/01/19 职场文书
创业计划书之寿司
2019/07/19 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python