?
題目:給出旋轉(zhuǎn)矩形的四個頂點 p1(x1, y1), p2(x2, y2), p3(x3, y3), p4(x4, y4) 或者 中心點 (cx,cy),(w,h),θ 畫一個旋轉(zhuǎn)的實心矩陣:輸出numpy數(shù)組,矩形內(nèi)的值全部為255
看方法直接看最下邊
看方法直接看最下邊
看方法直接看最下邊
一、通過中心點、寬高、角度得到四個頂點的公式網(wǎng)上都有,最后輸出四個頂點的x和y坐標。
import numpy as np
rectangle = [cx,cy,w,h,θ]
x1 = int(np.cos(rectangle[4])*(-rectangle[2]/2) - np.sin(rectangle[4])*(-rectangle[3]/2) + rectangle[0])
x2 = int(np.cos(rectangle[4])*(rectangle[2]/2) - np.sin(rectangle[4])*(-rectangle[3]/2) + rectangle[0])
x3 = int(np.cos(rectangle[4])*(-rectangle[2]/2) - np.sin(rectangle[4])*(rectangle[3]/2) + rectangle[0])
x4 = int(np.cos(rectangle[4])*(rectangle[2]/2) - np.sin(rectangle[4])*(rectangle[3]/2) + rectangle[0])
y1 = int(np.sin(rectangle[4])*(-rectangle[2]/2) + np.cos(rectangle[4])*(-rectangle[3]/2) + rectangle[1])
y2 = int(np.sin(rectangle[4])*(rectangle[2]/2) + np.cos(rectangle[4])*(-rectangle[3]/2) + rectangle[1])
y3 = int(np.sin(rectangle[4])*(-rectangle[2]/2) + np.cos(rectangle[4])*(rectangle[3]/2) + rectangle[1])
y4 = int(np.sin(rectangle[4])*(rectangle[2]/2) + np.cos(rectangle[4])*(rectangle[3]/2) + rectangle[1])
二、繪制實心矩形
關(guān)于怎么繪制實心矩形,因為openCV本身的cv2.rectangle只能繪制角度為0的矩形,沒辦法用,所以一開始打算遍歷每個點判斷是否在矩形內(nèi),來繪制
from shapely import geometry
def ifPointsInside(polygon, Points):
line = geometry.LineString(polygon)
point = geometry.Point(Points)
polygon = geometry.Polygon(line)
return polygon.contains(point)
以及用凹凸多邊形來判斷、用四個三角形面積和矩形面積對比來找
結(jié)果因為每個點都要遍歷計算,我是用來處理深度學習資料的,一萬多張圖片,640*480分辨率,那就是30多億次,他沒遍歷完,我人就先走了,太慢
然后想到了:先用cv2.line繪制邊框,然后圖像按橫遍歷找里面的255值,找到兩個255的話就把這兩個中間的全都標記255,成功了,不過還是慢
最后解決方法:用cv2.line一條線一條線的畫,從(x1,y1)->(x2,y2)一直畫到(x3,y3)->(x4,y4)
Output = np.zeros((480,640,1))
#我的用單通道,三通道就把1改成3,下面的(255)改成(255,255,255)
a = (y3-y1)/(x3-x1)
#這個是用來計算斜率
for x in range(0,abs(x3-x1)):
cv2.line(Output,(int(x1+x),int(y1+a*x)),(int(x2+x),int(y2+a*x)), (255), 2)
按1pixel畫,精度不夠,改為0.01步伐文章來源:http://www.zghlxwxcb.cn/news/detail-704752.html
Output = np.zeros((480,640,1))
a = (y3-y1)/(x3-x1)
for x in range(0,100*abs(x3-x1)):
cv2.line(Output,(int(x1+x/100),int(y1+a*x/100)),(int(x2+x/100),int(y2+a*x/100)), (255), 2)
畫出來了文章來源地址http://www.zghlxwxcb.cn/news/detail-704752.html
(23/09/09)然后我發(fā)現(xiàn)opencv有函數(shù),真的是蠢哭了:
bbox=[[x1,y1],[x2,y2],[x3,y3],[x4,y4],...]
image = cv2.fillPoly(image, [np.array(bbox)], color)
到了這里,關(guān)于使用openCV python繪制實心旋轉(zhuǎn)的矩形的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!