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 RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
在Python中用split()方法分割字符串的使用介绍
May 20 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
django中send_mail功能实现详解
Feb 06 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
浅谈pyqt5在QMainWindow中布局的问题
Jun 21 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
php 结果集的分页实现代码
2009/03/10 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
28个JS验证函数收集
2010/03/02 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
javascript关于继承解析
2016/05/10 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
python 获取et和excel的版本号
2009/04/09 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
python实现自动解数独小程序
2019/01/21 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
2014年社区庆元旦活动方案
2014/03/08 职场文书
学校文明单位申报材料
2014/05/06 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
三行辞职书范文
2015/02/26 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL