问题描述
我试图从 aruco 代码中找到倾斜角度,我对使用 aruco 代码还很陌生,所以我不知道从哪里开始尝试解决这个问题。我只需要获取信息(角度和方向(相对于屏幕))并将其打印到 .txt 文件中。
我包含了迄今为止我编写的代码。我不知道这是否有帮助,我只是把它放在那里以防它有任何用处。
这是我目前的代码:
import time
import cv2
import cv2.aruco as aruco
import math
passedA = False
passedB = False
angleA = 0
angleB = 0
tsB = 0
tsA = 0
speed = 0
timeDist = 0
disCalc = 1
def getAngle(a,b,c):
ang = math.degrees(math.atan2(c[1] - b[1],c[0] - b[0]) - math.atan2(a[1] - b[1],a[0] - b[0]))
return ang + 360 if ang < 0 else ang
def findArucoMarkers(img,markerSize=6,totalMarkers=250,draw=True):
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
key = getattr(aruco,f'DICT_{markerSize}X{markerSize}_{totalMarkers}')
arucoDict = aruco.Dictionary_get(key)
arucoParam = aruco.DetectorParameters_create()
bbox,ids,rejected = aruco.detectMarkers(imgGray,arucoDict,parameters=arucoParam)
if draw:
aruco.drawDetectedMarkers(img,bbox)
return [bbox,ids]
def augmentAruco(bbox,id,img,imgAug,drawID=True):
tl = bbox[0][0][0],bbox[0][0][1]
tr = bbox[0][1][0],bbox[0][1][1]
br = bbox[0][2][0],bbox[0][2][1]
bl = bbox[0][3][0],bbox[0][3][1]
textPos = int(bbox[0][0][0]) - int(30),int(bbox[0][0][1]) + int(30)
centerW = float(bbox[0][2][0] - bbox[0][0][0]) / float(2) + float(bbox[0][0][0])
centerH = float(bbox[0][2][1] - bbox[0][0][1]) / float(2) + float(bbox[0][0][1])
center = int(centerW),int(centerH)
angleFactor = int(centerW),int(centerH) + int(-100)
# print(bbox)
# print(centerW)
# print(centerH)
# print(center)
# print(angleA)
# print(angleB)
# h,w,c = imgAug.shape
# pts1 = np.array([tl,tr,br,bl])
if id == 0:
if 150 < int(centerW) < 170:
global angleA
angleA = getAngle(tr,center,angleFactor)
global tsA
tsA = time.time()
print("Pos A angle = " + str(angleA) + " DEGREES")
print("Pos A timestamp = " + str(tsA) + " SECONDS")
global passedA
passedA = True
# print(passedA)
if id == 0:
if 400 < int(centerW) < 420:
global angleB
angleB = getAngle(tr,angleFactor)
global tsB
tsB = time.time()
print("Pos B angle = " + str(angleB) + " DEGREES")
print("Pos B timestamp = " + str(tsB) + " SECONDS")
global passedB
passedB = True
# print(passedB)
if passedA and passedB:
if id == 0:
if 480 < int(centerW) < 520:
angleChange = float(angleA) - float(angleB)
global timeDist
timeDist = float(tsB) - float(tsA)
global speed
speed = float(disCalc) / float(timeDist)
angleChangePerS = float(angleChange) / float(timeDist)
if angleB > angleA:
angleChange = float(angleA) + float(360) - (float(angleB))
angleChangePerS = float(angleChange) / float(timeDist)
print(speed)
print("the angle changed by " + str(angleChangePerS) + " degrees per second")
print("The speed of the disc is " + str(speed) + " feet per per second")
f = open("Resources/DiscReadings.txt","w")
f.write("%s \n %s \n %s \n" % (str(speed),str(angleChangePerS),0))
f.writelines([str(speed),str(angleChangePerS)])
f.close()
else:
print("the angle changed by " + str(angleChangePerS) + " degrees per second")
print("The speed of the disc is " + str(speed) + " feet per per second")
f = open("Resources/DiscReadings.txt","w")
f.write("%s \n %s \n %s \n" % (1,str(speed),str(angleChangePerS)))
f.close()
if drawID:
cv2.putText(img,str(id),textPos,cv2.FONT_HERSHEY_COMPLEX,.7,(255,255),2)
cv2.putText(img,str("."),10,0),2)
cv2.line(img,3)
cv2.line(img,angleFactor,3)
# cv2.line(img,(0,(img.shape[1],img.shape[0]),255,3)
return img
def main():
cap = cv2.VideoCapture(0)
imgAug = cv2.imread("Resources/target.png")
while True:
success,image = cap.read()
arucoFound = findArucoMarkers(image)
if len(arucoFound[0]) != 0:
for bbox,id in zip(arucoFound[0],arucoFound[1]):
image = augmentAruco(bbox,image,imgAug)
cv2.imshow("Image",image)
cv2.waitKey(1)
if __name__ == "__main__":
main()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)