1 Reply Latest reply on Mar 24, 2018 7:20 PM by tutin

    Need Python OpenCV Code Help


      Hello Element14 Community!

           This past week I have been revisiting python 3(.5) with OpenCV 3(.2.0 + contrib) on my Windows 10 PC. However I am working on an basic augmented reality application and i have been trying to use OpenCV's ArUco markers module. So far the documentation of this module with OpenCV has been very challenging to understand and is only explained in C/C++. So after a couple days of research and several educated guesses I figured out some of the basic usage for the module and got it to where it is able to identify the marker, highlight it and then calculate the Pose of the marker and draw its axes in a three dimensional space. However that is as far as i could get on my own with my very limited knowledge of the terminology of this module and OpenCV. I am currently having a few issues with my Python code. For one, my code is only able to draw one markers axis with out giving me a error message:

      Traceback (most recent call last):
        File "C:\Users\bdogk\Desktop\OpenCV\Augmented Reality - v2.py", line 34, in <module>
          aruco.drawAxis(frame, mtx, dist, rvec, tvec, 0.1) #Draw Axis
      cv2.error: D:\Build\OpenCV\opencv-3.2.0\modules\calib3d\src\calibration.cpp:599: error: (-5) Rotation must be represented by 1x3 or 3x1 floating-point rotation vector, or 3x3 rotation matrix in function cvProjectPoints2


      The program works fine with one marker. How can I have my program work for multiple markers? I hashed out the drawAxis function in my code and it worked and highlighted both markers. Here is my full code:


      import numpy as np
      import cv2
      import cv2.aruco as aruco
      cap = cv2.VideoCapture(0)
      with np.load('webcam_calibration_output.npz') as X:
          mtx, dist, _, _ = [X[i] for i in ('mtx','dist','rvecs','tvecs')]
          ret, frame = cap.read()
          # operations on the frame come here
          gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
          aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
          parameters =  aruco.DetectorParameters_create()
          '''    detectMarkers(...)
              detectMarkers(image, dictionary[, corners[, ids[, parameters[, rejectedI
              mgPoints]]]]) -> corners, ids, rejectedImgPoints
          #lists of ids and the corners beloning to each id
          corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
          font = cv2.FONT_HERSHEY_SIMPLEX #font for displaying text (below)
          if ids != None:
              rvec, tvec = aruco.estimatePoseSingleMarkers(corners, 0.05, mtx, dist) #Estimate pose of each marker and return the values rvet and tvec---different from camera coeficcients
              (rvec-tvec).any() # get rid of that nasty numpy value array error
              aruco.drawAxis(frame, mtx, dist, rvec, tvec, 0.1) #Draw Axis
              aruco.drawDetectedMarkers(frame, corners) #Draw A square around the markers
              ###### DRAW ID #####
              cv2.putText(frame, "Id: " + str(ids), (0,64), font, 1, (0,255,0),2,cv2.LINE_AA)
              ##### DRAW "NO IDS" #####
              cv2.putText(frame, "No Ids", (0,64), font, 1, (0,255,0),2,cv2.LINE_AA)
          # Display the resulting frame
          if cv2.waitKey(1) & 0xFF == ord('q'):
      # When everything done, release the capture

      I also plan on displaying images over the markers but i dont know how to get the coordinates of the markers center, help? Any links or information would be greatly appreciated! Thank you!


      P.S. The marker i have been using is attached to this post.