Skip to content

Commit e130379

Browse files
committed
flir camera charuco pose estimation
using the openpose calibration....
1 parent 2d4a15c commit e130379

File tree

3 files changed

+177
-7
lines changed

3 files changed

+177
-7
lines changed

calibration/openpose/flir_aruco.py

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
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

flir/flir_capture_single.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@
1515

1616
args = vars(ap.parse_args())
1717

18-
camera_serial = args["camera"]
19-
20-
21-
22-
2318
def set_trigger_mode_software(cam):
2419
cam.TriggerMode.SetValue(PySpin.TriggerMode_Off)
2520
cam.TriggerSource.SetValue(PySpin.TriggerSource_Software)
@@ -51,7 +46,11 @@ def reset_trigger_mode_software(cam):
5146
print("camera {} serial: {}".format(i, cam.GetUniqueID()))
5247

5348

54-
#camera_serial = "18284509"
49+
camera_serial = args["camera"]
50+
if camera_serial == "0":
51+
camera_serial = cam_list.GetByIndex(0).GetUniqueID()
52+
print("no camera specified (use -c), using the first one in the list {}".format(camera_serial))
53+
5554

5655
cam = cam_list.GetBySerial(camera_serial)
5756

flir/flir_detect_aruco.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ def reset_trigger_mode_software(cam):
2525
cam.TriggerMode.SetValue(PySpin.TriggerMode_Off)
2626
print("reset trigger mode")
2727

28-
2928
#
3029
# setup
3130
#

0 commit comments

Comments
 (0)