介绍
小编给大家分享一下使用python实现在图片上画特定大小角度矩形框的方法,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
做图像识别的时候需要在图片中画出特定大小和角度的矩形框,自己写了一个函数,给定的输入是图片名称,矩形框的位置坐标,长宽和角度,直接输出画好矩形框的图片。
主要思想是先根据x, y坐标和长宽得到矩形,然后通过数学计算得到旋转角度角度后的新矩形框的四个顶点位置坐标,再利用draw.line()函数画出来。
import 数学 import matplotlib.pyplot  as plt import numpy  as np 得到PIL import 形象,ImageDraw def 画(文件名,结果): 时间=img 才能;Image.open(文件名) w h=img.size才能 时间=draw 才能;ImageDraw.Draw (img) 结果才能=np.array(结果) x=结果才能[0][0] ,,y=结果[0][1] 角才能结果[0]=[2] 高度才能结果[0]=[3] 宽度才能结果[0]=[4] 时间=anglePi 才能;角* math.pi/180.0 时间=cosA 才能;math.cos (anglePi) sinA 才能=,sin (anglePi) ,x1=x - 0.5 *宽度 ,日元=y - 0.5 *高度 ,x0=x + 0.5 *宽度 ,y0=日元 x1, x2=,y2=y + 0.5 *高度 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)],,填补=(0,0,255)) draw.line才能([(x1n, y1n), (x2n, y2n)],,填补=(255,0,0)) draw.line才能([(x2n, y2n), (x3n, y3n)],填补=,(0,0255)) draw.line才能([(y0n x0n也),(x3n, y3n)],填补=(255,0,0)) plt.imshow才能(img) plt.show才能()
改写成c++
由于c++程序也需要用到这个程序,改写一下
void CopentestDlg: OnBnClickedAnaly () { CString 才能;x, y,角,宽度; float 才能xRaw [4],, yRaw [4]; float 才能xNew [4],, yNew [4]; float 才能;height =, 33; if 才能;(imageCut==NULL), { ,,,AfxMessageBox (_T(“未打开图片不能分析“)); ,,,返回; ,,} GetDlgItem才能(IDC_EX)→GetWindowText (x); GetDlgItem才能(IDC_EY)→GetWindowText (y); GetDlgItem才能(IDC_ANGLE)→GetWindowText(角); GetDlgItem才能(IDC_WIDTH)→GetWindowText(宽度); float 才能;xf =, _tstof (x),,//因为将字符串转成浮动类型 float 才能;yf =, _tstof (y); float 才能;widthf=, _tstof(宽度); float 才能;anglef=, _tstof(角); xRaw才能[1],=,xf 作用;0.5 * widthf; yRaw才能[1],=,yf 作用;0.5 *高度; xRaw才能[0],=,xf +, 0.5 * widthf; yRaw才能[0],=,yRaw [1]; xRaw才能[2],=,xRaw [1]; yRaw才能[2],=,yf +, 0.5 *高度; xRaw才能[3],=,xRaw [0]; yRaw才能[3],=,yRaw [2]; float 才能;anglePi =, -anglef * pi /, 180.0; float 才能;cosA =,因为(anglePi); float 才能;sinA =,罪(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); null null null null null null使用python实现在图片上画特定大小角度矩形框的方法