????????這邊剛剛解決了一個(gè)連線算法問(wèn)題嘿期,同學(xué)階段性匯報(bào)回來(lái)疚膊,說(shuō)老師讓他將在空中看坦克群的視角方向考慮進(jìn)去忽舟,也就是說(shuō)在不同視角下看同一類型的坦克要盡量保證一樣,這樣在訓(xùn)練數(shù)據(jù)的時(shí)候也能降低誤差日川,值得一提的是蔓腐,他的老師肯定了我連線算法的可行性,可以作為一個(gè)創(chuàng)新點(diǎn)來(lái)匯報(bào)龄句。
????????我仔細(xì)一尋思回论,老師說(shuō)的沒(méi)錯(cuò),在空中偵查坦克的視角是隨機(jī)的分歇,這一點(diǎn)不解決確實(shí)會(huì)影坦克意圖的判別傀蓉,怎樣解決呢?看來(lái)還是要從圖片處理的角度入手职抡,我發(fā)現(xiàn)在多種圖片體系變換中僚害,透視變換是指利用透視中心、像點(diǎn)繁调、目標(biāo)點(diǎn)三點(diǎn)共線的條件,按透視旋轉(zhuǎn)定律使透視面繞透視軸旋轉(zhuǎn)某一角度靶草,破壞原有的投影光束蹄胰,仍能保持透視面上投影幾何圖形不變的變換∞认瑁看來(lái)只要實(shí)現(xiàn)了透視變換就可以解決不同視角問(wèn)題裕寨。
????????在Python中可以先用numpy庫(kù)將圖片轉(zhuǎn)換為矩陣格式,而后使用opencv對(duì)矩陣進(jìn)行透視變換,最后重新生成圖片宾袜,這樣得到的圖片就是被拉伸到統(tǒng)一視角下的狀態(tài)捻艳,其實(shí)際做法是在目標(biāo)圖片中首先通過(guò)模板匹配大致找到目標(biāo),然后在目標(biāo)周圍確定四個(gè)點(diǎn)(這些點(diǎn)要距離目標(biāo)稍遠(yuǎn)一些庆猫,否則會(huì)造成透視變換之后的目標(biāo)再次匹配時(shí)出現(xiàn)找不到目標(biāo)的情況)认轨,而后將這四個(gè)點(diǎn)以及四點(diǎn)連線中間的所有像素點(diǎn)一起拉伸到同一平面,即可完成透視變換月培。
根據(jù)上述思路嘁字,直接上代碼:
tpl ="D://PythonPicTemplate/binarization/tankTemplate3.jpg"
target = "D://PythonPicTemplate/binarization/tanks4.jpg"?
tpl = Img_read(tpl)?
target = Img_read(target)?
###透視變換?
methods = []?
for o in range(0,num):?
? ? methods.append(cv.TM_CCORR_NORMED)?
th, tw = tpl.shape[:2]?
rows, cols = target.shape[:2]?
i =0?
tl0 = []?
br0 = []?
for md in methods:?
? ? #print(md)?
? ? result = cv.matchTemplate(target, tpl, md)?
? ? min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)?
? ? if md == cv.TM_SQDIFF_NORMED:?
? ? ? ? tl0.append(min_loc)?
? ? else:?
? ? ? ? tl0.append(max_loc)?
? ? br0.append((tl0[i][0]+tw, tl0[i][1]+th))? ?
? ? cv.rectangle(target, tl0[i], br0[i], (0, 0, 255),2)?
? ? i += 1?
tl2 = []?
tl3 = []?
tl4 = []?
for q in tl0:?
? ? tl3.append(q[0] - tw)?
? ? tl4.append(q[1] - th)?
for p in br0:?
? ? tl3.append(p[0])?
? ? tl4.append(p[1])?
min_x = min(tl3)?
min_y = min(tl4)?
max_x = max(tl3)?
max_y = max(tl4)?
tl2.append([min_x - 2 * tw,min_y - 2 * th])?
tl2.append([min_x - 2 * tw,max_y + 2 * th])?
tl2.append([max_x + 2 * tw,min_y - 2 * th])?
tl2.append([max_x + 2 * tw,max_y + 2 * th])?
# 原圖中已經(jīng)識(shí)別的四個(gè)角點(diǎn)?
pts1 = np.float32(tl2)?
# 變換后分別在左上、右上杉畜、左下纪蜒、右下四個(gè)點(diǎn)?
#pts2 = np.float32([[0, 0],[0, 500], [500, 0],[500, 500]])?
pts2 = np.float32([[0, 0],[0, cols], [rows, 0],[rows, cols]])?
#rows, cols?
# 生成透視變換矩陣?
M = cv.getPerspectiveTransform(pts1, pts2)?
# 進(jìn)行透視變換?
dst = cv.warpPerspective(target, M, (rows, cols))?
cv.namedWindow("match-PerspectiveTransformation", cv.WINDOW_NORMAL)?
cv.imshow("match-PerspectiveTransformation", dst)?
結(jié)果如下圖所示:
代碼已上傳至GitHub及Gitee,歡迎star此叠,歡迎討論:
GitHub:https://github.com/wangwei39120157028/Machine_Learning_research_on_simple_target_recognition_and_intention_analysis
Gitee:https://gitee.com/wwy2018/Machine_Learning_research_on_simple_target_recognition_and_intention_analysis/settings