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实现爬虫下载漫画示例
Feb 16 Python
详解Python中的Cookie模块使用
Jul 06 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
Mar 13 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
pytorch: Parameter 的数据结构实例
Dec 31 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
如何使用python代码操作git代码
Feb 29 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
python实现数字炸弹游戏程序
Jul 17 Python
使用python爬取抖音app视频的实例代码
Dec 01 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实现的获取URL信息的类
2007/01/02 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
CI框架Session.php源码分析
2014/11/03 PHP
php使用数组填充下拉列表框的方法
2015/03/31 PHP
事件模型在各浏览器中存在差异
2010/10/20 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
node和vue实现商城用户地址模块
2018/12/05 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
财务会计人员求职的自我评价
2014/01/13 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
请假条格式范文
2014/04/10 职场文书
赢在执行观后感
2015/06/16 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
新手入门Mysql--sql执行过程
2021/06/20 MySQL
nginx共享内存的机制详解
2022/03/21 Servers