open cv+python
で動画をテンプレートマッチングにかけ複数検知しています。
現状しているのが敵キャラ複数、味方キャラ1、味方キャラ2、この3つをテンプレマッチしていますしています。
したいことは味方キャラ2つから敵キャラ複数へ長さを測り一番短いところを抽出後、2つの長さでより長いほうを表示しようとしています。
結果的にその結果さえ出せれば良くて実際できているはずなのですが実行後エラーで終了してしまいます。
Warning: data is not aligned! This can lead to a speed los ValueError: Input vector should be 1-D.
詰んでしまっています。どなたか助けてください。。
参考にコードも載せておきます。
python
1import cv2 2import numpy as np 3from scipy.spatial import distance 4from itertools import zip_longest 5lightbluelist=[] 6purplelist=[] 7enemylist=[] 8minmaxlist=[] 9 10 11 12cap = cv2.VideoCapture(1)#仮想カメラから動画ファイル読み込み 13 14template2 = cv2.imread("temp2005.jpg")#テンプレ2 水 15_, w, h = template2.shape[::-1] 16 17template4 = cv2.imread("temp2003.jpg")#テンプレ4 紫 18_, w, h = template4.shape[::-1] 19 20template12 = cv2.imread("enemy.jpg")#テンプレ12 敵 21_, w, h = template12.shape[::-1] 22 23 24 25while(True): 26 ret, frame = cap.read() 27 28 #テンプレ2 水色味方 29 res2 = cv2.matchTemplate(frame, template2, cv2.TM_CCOEFF_NORMED) 30 loc2 = np.where( res2 >= 0.7) 31 pt2 = res2 32 for pt2 in zip(*loc2[::-1]): 33 cv2.rectangle(frame, pt2, (pt2[0] + w, pt2[1] + h), (255, 1+25, 0), 2)#四角 34 35 #テンプレ4 紫味方 36 res4 = cv2.matchTemplate(frame, template4, cv2.TM_CCOEFF_NORMED) 37 loc4 = np.where( res4 >= 0.7) 38 pt4 = res4 39 for pt4 in zip(*loc4[::-1]): 40 cv2.rectangle(frame, pt4, (pt4[0] + w, pt4[1] + h), (255, 0, 125), 2)#四角 41 42 #テンプレ12 敵 43 res12 = cv2.matchTemplate(frame,template12,cv2.TM_CCOEFF_NORMED) 44 loc12 = np.where( res12 >= 0.8) 45 pt12 = res12 46 47 for pt12 in zip(*loc12[::-1]): 48 cv2.rectangle(frame, pt12, (pt12[0] + w, pt12[1] + h), (0, 0, 255), 2)#四角 49 #cv2.arrowedLine(frame, pt2, pt12, (255, 125, 0), 2) 50 #cv2.arrowedLine(frame, pt4, pt12, (255, 0, 125), 2) 51 52 lightblue = distance.euclidean(pt2, pt12)#水色と敵の距離 53 lightbluelist.insert(0, lightblue) 54 55 purple = distance.euclidean(pt4, pt12)#紫色と敵の距離 56 purplelist.insert(0, purple) 57 58 for pt2, pt12 in zip_longest(*loc2[::-1],fillvalue=pt2): 59 #print(min(lightbluelist)) 60 lightblue1 = (min(lightbluelist)) 61 62 for pt4, pt12 in zip_longest(*loc4[::-1],fillvalue=pt4): 63 #print(min(purplelist)) 64 purple1 = (min(purplelist)) 65 66 #各味方と一番近い敵の距離の最大 67 minmaxlist.insert(0, lightblue1) 68 minmaxlist.insert(0, purple1) 69 70 #del minmaxlist[2:] 71 72 print(f"enemylist{minmaxlist}") 73 print(max(minmaxlist)) 74 75 if max(minmaxlist) == lightblue1: 76 for pt2 in zip(*loc2[::-1]): 77 cv2.circle(frame, pt2, 8, (50, 255, 125), 3, 10) 78 79 if max(minmaxlist) == purple1: 80 for pt4 in zip(*loc4[::-1]): 81 cv2.circle(frame, pt4, 8, (50, 255, 125), 3, 10) 82 83 84 key = cv2.waitKey(1) 85 if key == ord("q"): 86 break 87 88 lightbluelist.clear() 89 purplelist.clear() 90 minmaxlist.clear() 91 92cap.release() 93cv2.destroyAllWindows()
あなたの回答
tips
プレビュー