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 相关文章推荐
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
python中while循环语句用法简单实例
May 07 Python
详解Python命令行解析工具Argparse
Apr 20 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
python批量替换多文件字符串问题详解
Apr 22 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
python项目对接钉钉SDK的实现
Jul 15 Python
pycharm运行scrapy过程图解
Nov 22 Python
Python实战之实现简易的学生选课系统
May 25 Python
Python requests用法和django后台处理详解
Mar 19 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初学者头疼问题总结
2006/10/09 PHP
PHP自动更新新闻DIY
2006/10/09 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
python 调用Google翻译接口的方法
2020/12/09 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
法律顾问服务方案
2014/05/15 职场文书
2014年征兵标语
2014/06/20 职场文书
六查六看剖析材料
2014/10/06 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python
Java集成swagger文档组件
2021/06/28 Java/Android
HTML+JS实现在线朗读器
2022/02/15 Javascript
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
Python 绘制多因子柱状图
2022/05/11 Python
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技