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实现问号表达式(?)的方法
Nov 27 Python
Python编程中的反模式实例分析
Dec 08 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
python3.5使用tkinter制作记事本
Jun 20 Python
Python日期时间对象转换为字符串的实例
Jun 22 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
python中数据库like模糊查询方式
Mar 02 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
Python经典五人分鱼实例讲解
Jan 04 Python
在Python中如何使用yield
Jun 07 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
关于this和self的使用说明
2010/08/01 Javascript
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现k-means聚类算法
2018/02/23 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
windows支持哪个版本的python
2020/07/03 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
大学计划书范文800字
2014/08/14 职场文书
大学同学聚会感言
2015/07/30 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python