我正在構建一個視頻游戲疊加層,將資料發送回玩家以創建自定義 HUD,只是為了好玩。我正在嘗試讀取視頻游戲指南針的影像并確定指南針的確切方向作為我的 HUD 的一部分。
在螢屏頂部顯示指南針的示例照片:
(當前面向 ~170° 的圓圈,注意:指南針的位置也是固定的)
在螢屏頂部顯示指南針的示例照片:
顯然,當我在指南針上進行影像處理時,我只會看指南針而不是整個螢屏。
與我之前的 HUD 計算機視覺方面相比,這對我來說更具挑戰性。我一直在嘗試使用 cv2 處理影像,并從那里使用一些物件檢測來找到指南針的“針”。
我正在努力在任一針上進行三角形形狀檢測,這將幫助我了解我的方向。
解決方案可能技術含量較低且更駭人聽聞,也許只是搜索指南針邊緣的像素并確定那是針的末端。
我認為不可行的一種解決方案是使用物件檢測來找到一張指南針面向正北的圖片,然后計算當前指南針的旋轉。這是因為指南針的背景不會旋轉,只有指標會旋轉。
到目前為止,我已經應用了霍夫圓變換,如下所示:
我知道這是一個非常開放的問題,但我正在尋找任何可以幫助我實施解決方案的理論解決方案。任何事情都會有所幫助,因為這對我來說是一個奇怪的問題,我正在努力思考如何解決它。
uj5u.com熱心網友回復:
一般來說,我建議在邊框或指南針下方查看一個薄環(這將使您的誤差最小)。您可以處理該環的極坐標變換影像,也可以直接處理該環,尋找紅色的重心。這個相對于指南針中心的重心應該給你角度。很可能您甚至不需要極坐標變換。
im = cv.imread("RPc9Q.png")
(x,y,w,h) = (406, 14, 29, 29)
warped = cv.warpPolar(
src=im,
dsize=(512, 512),
center=(x (w-1)/2, y (h-1)/2),
maxRadius=(w-1)/2,
flags=cv.WARP_POLAR_LINEAR | cv.INTER_LINEAR
)
uj5u.com熱心網友回復:
這里有更多關于極地經線方法的詳細說明。
- 極地經線
- 取一列像素,作為源圖片中的一個圓圈
- 密謀看看那里有什么
- argmax 找到箭頭的紅色位
im = cv.imread("RPc9Q.png") * np.float32(1/255)
(x,y,w,h) = (406, 14, 29, 29)
# polar warp...
steps_angle = 360 * 2
steps_radius = 512
warped = cv.warpPolar(
src=im,
dsize=(steps_radius, steps_angle),
center=(x (w-1)/2, y (h-1)/2),
maxRadius=(w-1)/2,
flags=cv.WARP_POLAR_LINEAR | cv.INTER_LANCZOS4
)
# goes 360 degrees, starting from 90 degrees (east) clockwise
# sample at 85% of "full radius", picked manually
col = int(0.85 * steps_radius)
# for illustration
imshow(cv.rotate(cv.line(warped.copy(), (col, 0), (col, warped.shape[0]), (0, 0, 255), 1), rotateCode=cv.ROTATE_90_COUNTERCLOCKWISE))
signal = warped[:,col,2] # red channel, that column
# polar warp coordinate system:
# first row of pixels is sampled at exactly 90 degrees (east)
samplepoints = np.arange(steps_angle) / steps_angle * 360 90
imax = np.argmax(signal) # peak
def vertex_parabola(y1, y2, y3):
return 0.5 * (y1 - y3) / (y3 - 2*y2 y1)
# print("samples around maximum:", signal[imax-1:imax 2] * 255)
imax = vertex_parabola(*signal[imax-1:imax 2].astype(np.float32))
# that slice will blow up in your face if the index gets close to the edges
# either use np.roll() or drop the correction entirely
angle = imax / steps_angle * 360 90 # ~= samplepoints[imax]
print("angle:", angle) # 176.2
plt.figure(figsize=(16,4))
plt.xlim(90, 360 90)
plt.xticks(np.arange(90, 360 90, 45))
plt.plot(
samplepoints, signal, 'k-',
samplepoints, signal, 'k.')
plt.axvline(x=angle, color='r', linestyle='-')
plt.show()
uj5u.com熱心網友回復:
我已經能夠通過提供的反饋解決我的問題。
首先我抓取指南針的影像: step_1
在我處理影像后,羅盤的中間和邊緣被裁剪出來,如下所示: step_2
現在我有一個裁剪的指南針,只有一點點紅色顯示指南針指向的位置。我掩蓋了影像的紅色部分。 step_3
從那里可以簡單地找到blob的中心,該中心大致輸出針指向的位置。雖然這并不完全準確,但我相信它會為我的目的作業。 第4步
現在我知道針頭在哪里,根據它計算方向應該很容易。
一些參考資料: 使用 Python 和 OpenCV 查找影像中的紅色 https://www.geeksforgeeks.org/python-opencv-find-center-of-contour/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506599.html
標籤:Python opencv 图像处理 计算机视觉 游戏自动化