如何在 python 中使用 opencv 从 aruco 标记获取倾斜的倾斜度和方向?

问题描述

我试图从 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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...