Note

This notebook can be downloaded here: Aruco_detection-Tvec.ipynb

import numpy as np
import cv2
import cv2.aruco as aruco
import math
import random
import sys
#import time
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
#print(aruco_dict)
# second parameter is id number
# last parameter is total image size
img = aruco.drawMarker(aruco_dict, 2, 700)
cv2.imwrite("test_marker.jpg", img)

#cv2.imshow('frame',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
posorigine =[]
cap = cv2.VideoCapture(0)
mtx=np.array([[ 736.72620104,    0.        ,  335.09873285],
       [   0.        ,  784.55469771,  288.37183538],
       [   0.        ,    0.        ,    1.        ]])

dist=np.array([[  1.80626027e-01],
       [ -6.41707400e-01],
       [  5.59047400e-03],
       [  1.71301917e-03],
       [ -2.57102334e+00],
       [  6.96846440e-02],
       [ -4.08903572e-01],
       [ -2.89017255e+00],
       [  0.00000000e+00],
       [  0.00000000e+00],
       [  0.00000000e+00],
       [  0.00000000e+00],
       [  0.00000000e+00],
       [  0.00000000e+00]] )

#cv2.namedWindow("truc", cv2.WND_PROP_FULLSCREEN)
#cv2.resizeWindow('truc', 1200,1200)
#cv2.SetWindowProperty("truc",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
cv2.namedWindow("truc", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("truc",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    #print(frame.shape) #480x640
    # Our 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()

    #print(parameters)

    '''    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)
    #print(corners[0][0][0])
    size_of_marker =  0.0202 # side lenght of the marker in meter
    if len(corners)>0:
        rvecs,tvecs, trash = aruco.estimatePoseSingleMarkers(corners, size_of_marker, mtx, dist)
        length_of_axis = 0.01
        imaxis = aruco.drawDetectedMarkers(frame, corners, ids)

        for i in range(len(tvecs)):
            imaxis = aruco.drawAxis(imaxis, mtx, dist, rvecs[i], tvecs[i], length_of_axis)

        #It's working.
        # qqmy problem was that the cellphone put black all around it. The alrogithm
        # depends very much upon finding rectangular black blobs

        frame = aruco.drawDetectedMarkers(frame, corners)
        """for i in range(len(ids)):
            if ids[i]== 1:"""
        if posorigine != []:
            for i in ids:
                if i in trackedIds:
                    orgcorners = posorigine[list(trackedIds).index(i)]
                    newcorners = corners[list(ids).index(i)]
                #ax,ay,xmarkers,by,bx,deltax,deltay = calcul(corners,i)
                    cv2.line(frame,(orgcorners[0][0][0],orgcorners[0][0][1]),
                             (newcorners[0][0][0], newcorners[0][0][1]),(255,255,255),5)

          #deltax = float(int((abs(ax-bx)*2.81/xmarkers)*100)/100)
                    orgcornersbis = posoriginetvecs[list(trackedIds).index(i)]
                    newcornersbis = tvecs[list(ids).index(i)]
                    cal = np.sqrt((newcornersbis[0][0]-orgcornersbis[0][0])**2+(newcornersbis[0][1]-orgcornersbis[0][1])**2)*1000
                    cal = float(int(cal*100))/100


                    cv2.putText(frame,'x'+str(i)+':'+ str(cal),(0,100+25*i),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255),2)

        #print(rejectedImgPoints)
        # Display the resulting frame

        cv2.imshow('truc',frame)
        cv2.imshow('truc',imaxis)
    else:
        cv2.imshow('truc',frame)
    if cv2.waitKey(1) & 0xFF == ord('a'):
        posorigine = corners
        posoriginetvecs = tvecs
        trackedIds = ids
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
tvecs
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-1-f5df3c737808> in <module>()
----> 1 tvecs


NameError: name 'tvecs' is not defined
cap.release()
def calc_square(numbers):
    for n in numbers:
        print('square ' + str(n*n))

def calc_cube(numbers):
    for n in numbers:
        print('cube ' + str(n*n*n))

if __name__ == "__main__":
    arr = [2,3,8]
    p1 = multiprocessing.Process(target=calc_square, args=(arr,))
    p2 = multiprocessing.Process(target=calc_cube, args=(arr,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()


    print(calc_square(arr),"Done!")
ids
ids = [4,5,2]
ids
ids.index(5)
d = dict()