1+ import sys
2+ import time
3+ import PySpin
4+ import os
5+
6+ import numpy as np
7+ import cv2
8+
9+ import argparse
10+
11+
12+ charuco_square_length = 140.0 / 1000 # chessboard square side length (normally in meters)
13+ charuco_marker_length = 88.0 / 1000 # marker side length (same unit than squareLength)
14+ squaresX = 5
15+ squaresY = 7
16+ dictionary = cv2 .aruco .getPredefinedDictionary (cv2 .aruco .DICT_4X4_250 )
17+ board = cv2 .aruco .CharucoBoard_create (squaresX ,squaresY ,charuco_square_length ,charuco_marker_length ,dictionary )
18+
19+
20+
21+ filename = "models/18284509.xml"
22+
23+ fs = cv2 .FileStorage (filename , cv2 .FILE_STORAGE_READ )
24+
25+ intrinsics = fs .getNode ("Intrinsics" ).mat ()
26+ dist_coeffs = fs .getNode ("Distortion" ).mat ()
27+
28+ fs .release ()
29+
30+
31+
32+ # construct the argument parse and parse the arguments
33+ ap = argparse .ArgumentParser ()
34+ ap .add_argument ("-c" , "--camera" , type = str , default = "0" , help = "camera by id" )
35+
36+ args = vars (ap .parse_args ())
37+
38+ def set_trigger_mode_software (cam ):
39+ cam .TriggerMode .SetValue (PySpin .TriggerMode_Off )
40+ cam .TriggerSource .SetValue (PySpin .TriggerSource_Software )
41+ cam .TriggerMode .SetValue (PySpin .TriggerMode_On )
42+ print ("set trigger mode software" )
43+
44+
45+ def reset_trigger_mode_software (cam ):
46+ cam .TriggerMode .SetValue (PySpin .TriggerMode_Off )
47+ print ("reset trigger mode" )
48+
49+
50+
51+ def find_charuco_board (img , board , dictionary ):
52+ corner_criteria = (cv2 .TERM_CRITERIA_EPS + cv2 .TERM_CRITERIA_MAX_ITER , 100 , 0.00001 )
53+ gray = cv2 .cvtColor (img , cv2 .COLOR_BGR2GRAY )
54+
55+ corners , ids , rejectedImgPoints = cv2 .aruco .detectMarkers (gray , dictionary )
56+ if len (corners )> 0 :
57+ for corner in corners :
58+ cv2 .cornerSubPix (gray , corner , winSize = (3 ,3 ), zeroZone = (- 1 ,- 1 ), criteria = corner_criteria )
59+ ret , detectedCorners , detectedIds = cv2 .aruco .interpolateCornersCharuco (corners ,ids ,gray ,board )
60+ if detectedCorners is not None and detectedIds is not None and len (detectedCorners )> 3 :
61+ return detectedCorners , detectedIds
62+ return [], []
63+
64+
65+
66+
67+
68+
69+ #
70+ # setup
71+ #
72+
73+ system = PySpin .System .GetInstance ()
74+ cam_list = system .GetCameras ()
75+
76+ if cam_list .GetSize () == 0 :
77+ print ("no cameras found, aborting" )
78+ system .ReleaseInstance ()
79+ del system
80+ sys .exit ()
81+
82+ cameras = []
83+ for i in range (cam_list .GetSize ()):
84+ cam = cam_list .GetByIndex (i )
85+ print ("camera {} serial: {}" .format (i , cam .GetUniqueID ()))
86+
87+
88+ camera_serial = args ["camera" ]
89+ if camera_serial == "0" :
90+ camera_serial = cam_list .GetByIndex (0 ).GetUniqueID ()
91+ print ("no camera specified (use -c), using the first one in the list {}" .format (camera_serial ))
92+
93+
94+ cam = cam_list .GetBySerial (camera_serial )
95+
96+ try :
97+ cam .Init ()
98+ cam .AcquisitionMode .SetValue (PySpin .AcquisitionMode_Continuous )
99+ set_trigger_mode_software (cam )
100+ cam .BeginAcquisition ()
101+
102+ except :
103+ print ("error initializing camera {}" .format (camera_serial ))
104+ sys .exit ()
105+
106+
107+ #os.mkdir(camera_serial)
108+
109+
110+
111+ #
112+ # loop
113+ #
114+
115+ count = 0
116+
117+ while 1 :
118+ key = cv2 .waitKey (1 )
119+
120+
121+
122+ if key == 27 : # ESC
123+ cv2 .destroyAllWindows ()
124+ break
125+
126+ cam .TriggerSoftware ()
127+ i = cam .GetNextImage ()
128+ #print(i.GetWidth(), i.GetHeight(), i.GetBitsPerPixel())
129+ frame = None
130+
131+ font = cv2 .FONT_HERSHEY_SIMPLEX
132+
133+ if i .IsIncomplete ():
134+ pass
135+ else :
136+ # see documentation: enum ColorProcessingAlgorithm
137+ image_converted = i .Convert (PySpin .PixelFormat_BGR8 , PySpin .DIRECTIONAL_FILTER )
138+ image_data = image_converted .GetData ()
139+ frame = np .frombuffer (image_data , dtype = np .uint8 )
140+ frame = frame .reshape ((i .GetHeight (),i .GetWidth (),3 ))
141+
142+ corners , ids = find_charuco_board (frame , board , dictionary )
143+ cv2 .aruco .drawDetectedCornersCharuco (frame , corners , ids )
144+ valid , rvec , tvec = cv2 .aruco .estimatePoseCharucoBoard (corners , ids , board , intrinsics , dist_coeffs )
145+ if valid == True :
146+ cv2 .aruco .drawAxis (frame , intrinsics , dist_coeffs , rvec , tvec , 0.2 )
147+
148+ p3d = [tvec [0 ][0 ], tvec [1 ][0 ], tvec [2 ][0 ]]
149+
150+ # draw the coordinates
151+ cv2 .putText (frame ,"{0:.3f}" .format (p3d [0 ]), (100 ,200 ), font , 4 ,(0 ,0 ,255 ), 6 , cv2 .LINE_AA )
152+ cv2 .putText (frame ,"{0:.3f}" .format (p3d [1 ]), (100 ,400 ), font , 4 ,(0 ,255 ,0 ), 6 , cv2 .LINE_AA )
153+ cv2 .putText (frame ,"{0:.3f}" .format (p3d [2 ]), (100 ,600 ), font , 4 ,(255 ,0 ,0 ), 6 , cv2 .LINE_AA )
154+
155+
156+
157+ cv2 .imshow ("cam1" ,frame )
158+ i .Release ()
159+ del i
160+
161+ #
162+ # cleanup
163+ #
164+
165+ cam .EndAcquisition ()
166+ reset_trigger_mode_software (cam )
167+ cam .DeInit ()
168+ del cam
169+ del cam_list
170+
171+ system .ReleaseInstance ()
172+ del system
0 commit comments