import PyRVC as RVC
import sys
import os
import numpy as np
import cv2
from Utils.CaliBoardUtils import *
from Utils.Tools import *
def App(gamma, pattern_type):
opt = RVC.SystemListDeviceTypeEnum.All
print("RVC Camera devices number:", len(devices))
if len(devices) == 0:
print("Can not find any RVC Camera!")
exit(1)
if devices[0].IsFirmwareMatch() == False:
print("device firmware mismatch, Please use RVCManager to upgrade the firmware")
exit(1)
if x.IsValid() == False:
print("RVC Camera is not valid!")
exit(1)
ret1 = x.Open()
if x.IsOpen() == False:
print("Failed to open camera! Please check whether the camera is connected and make sure it is not occupied and supports X1.")
exit(1)
_, exp_range_min, exp_range_max = x.GetExposureTimeRange()
print("ExposureTime Range:[{}, {}]".format(exp_range_min, exp_range_max))
cap_opt = RVC.X1_CaptureOptions()
ret,cap_opt = x.LoadCaptureOptionParameters()
cap_opt.transform_to_camera = True
cap_opt.exposure_time_2d = 6
cap_opt.exposure_time_3d = 6
cap_opt.use_projector_capturing_2d_image = True
ret2 = x.Capture(cap_opt)
save_dir = "Data"
if not os.path.exists(save_dir):
os.makedirs(save_dir)
if ret2 == True:
img = x.GetImage()
if img.SaveImage(save_dir + "/image.png"):
print("Save image successed!")
else:
print("Save image failed!")
pm = np.array(x.GetPointMap(), copy=False).reshape(-1, 3)
if x.GetPointMap().Save("Data/test.ply", RVC.PointMapUnitEnum.Meter):
print("Save point map successed!")
else:
print("Save point map failed!")
img = np.array(img, copy=False)
cali_board_pose = GetCaliBoardPose(img,
pm,
gamma=gamma,
m_type=pattern_type)
if cali_board_pose is not None:
print("transformation:{}".format(np.linalg.inv(cali_board_pose)))
print("This transformation helps you transform point cloud from left camera coordinate of X1 to cali board coordinate")
else:
print("Get pose failed!")
else:
print("RVC Camera capture failed!")
x.Close()
exit(0)
x.Close()
if __name__ == "__main__":
"""
This demo shows how to get cali borad pose based on the X1 left camera coordinate.
For more details about order of circles center please see OpenCV documentation of
api findCirclesGrid().
argv[1]: gamma (gamma>0), for adjust image brightness. gamma>1 will increse image brightness
and gamma<1 will decrease image brightness
argv[2]: pattern_type, type of cali board pattern used. You can choose A2,A3, ..., A10
Center distance of circles on cali borad (m):
A2:0.08
A3:0.056
A4:0.04
A5:0.028
A6:0.02
A7:0.014
A8:0.01
A9:0.007
A10:0.0048
Please select a cali board pattern of appropriate size according to the working distance
of 3D camera. For details, please consult technical support.
"""
if len(sys.argv) != 3:
sys.exit("Invalid arguments: Usage: python3 GetCaliBoardPose.py 1 A4")
gamma = sys.argv[1]
pattern_type = sys.argv[2]
print("gamma:{},pattern_type:{}".format(gamma, pattern_type))
gamma = float(gamma)
App(gamma, pattern_type)