Note
This notebook can be downloaded here: Projet+calibration-Paul.ipynb
import numpy as np
import cv2, PIL, os
from cv2 import aruco
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
%matplotlib nbagg
imagesFolder = "E:\Desktop\S8\Projet 851\data"
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
fig = plt.figure()
nx = 8
ny = 6
for i in range(1, nx*ny+1):
ax = fig.add_subplot(ny,nx, i)
img = aruco.drawMarker(aruco_dict,i-1, 700)
plt.imshow(img, cmap = mpl.cm.gray, interpolation = "nearest")
ax.axis("off")
plt.savefig(imagesFolder + "/markers.pdf")
plt.show()
#plt.close()
<IPython.core.display.Javascript object>
board = aruco.CharucoBoard_create(3, 3, 1, 0.8, aruco_dict)
imboard = board.draw((4000, 4000))
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.imshow(imboard, cmap = mpl.cm.gray, interpolation = "nearest")
ax.axis("off")
cv2.imwrite(imagesFolder + "/chessboard.tiff",imboard)
#plt.savefig(imagesFolder + "/chessboard.pdf")
plt.grid()
plt.show()
print("Imprimer le damier de calibration!")
<IPython.core.display.Javascript object>
Imprimer le damier de calibration!
import cv2
import math
videoFile = "E:/Desktop/S8/Projet 851/outpy.avi"
imagesFolder = "E:/Desktop/S8/Projet 851/data/"
cap = cv2.VideoCapture(videoFile)
frameRate = cap.get(5) #frame rate
while(cap.isOpened()):
frameId = cap.get(1) #current frame number
ret, frame = cap.read()
if (ret != True):
break
if (frameId <150):
filename = imagesFolder + "\image_" + str(int(frameId)) + ".jpg"
cv2.imwrite(filename, frame)
cap.release()
print ("Done!")
Done!
im = PIL.Image.open(imagesFolder + "\image_0.jpg")
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.imshow(im)
ax.axis('off')
plt.show()
<IPython.core.display.Javascript object>
def read_chessboards(images):
"""
Charuco base pose estimation.
"""
print("POSE ESTIMATION STARTS:")
allCorners = []
allIds = []
decimator = 0
for im in images:
print("=> Processing image {0}".format(im))
frame = cv2.imread(im)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
res = cv2.aruco.detectMarkers(gray, aruco_dict)
if len(res[0])>0:
res2 = cv2.aruco.interpolateCornersCharuco(res[0],res[1],gray,board)
if res2[1] is not None and res2[2] is not None and len(res2[1])>3 and decimator%1==0:
allCorners.append(res2[1])
allIds.append(res2[2])
decimator+=1
imsize = gray.shape
return allCorners,allIds,imsize
print("finished")
#%%time
images = [imagesFolder + f for f in os.listdir(imagesFolder) if f.startswith("image_")]
allCorners,allIds,imsize=read_chessboards(images)
POSE ESTIMATION STARTS:
=> Processing image E:/Desktop/S8/Projet 851/data/image_69.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_139.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_15.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_145.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_12.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_142.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_60.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_130.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_67.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_137.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_52.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_2.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_83.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_102.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_29.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_5.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_55.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_84.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_105.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_27.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_20.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_31.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_36.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_38.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_114.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_95.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_44.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_113.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_92.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_43.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_126.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_76.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_121.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_71.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_128.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_78.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_21.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_26.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_28.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_54.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_4.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_85.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_104.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_3.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_53.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_82.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_103.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_66.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_136.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_61.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_131.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_13.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_143.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_68.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_138.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_14.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_144.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_129.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_79.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_120.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_70.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_127.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_77.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_112.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_93.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_42.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_39.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_115.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_94.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_45.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_37.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_30.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_124.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_74.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_123.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_73.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_116.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_97.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_46.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_111.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_90.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_41.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_33.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_34.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_118.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_99.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_48.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_25.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_59.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_9.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_88.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_109.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_22.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_0.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_50.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_81.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_100.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_57.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_7.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_86.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_107.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_62.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_132.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_65.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_135.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_19.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_149.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_17.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_147.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_10.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_140.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_35.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_119.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_98.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_49.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_32.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_110.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_91.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_40.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_117.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_96.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_47.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_122.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_72.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_125.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_75.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_11.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_141.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_16.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_146.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_64.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_134.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_18.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_148.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_63.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_133.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_6.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_56.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_87.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_106.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_51.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_1.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_80.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_101.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_23.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_24.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_8.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_58.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_89.jpg
=> Processing image E:/Desktop/S8/Projet 851/data/image_108.jpg
def calibrate_camera(allCorners,allIds,imsize):
"""
Calibrates the camera using the dected corners.
"""
print("CAMERA CALIBRATION")
cameraMatrixInit = np.array([[ 2000., 0., imsize[0]/2.],
[ 0., 2000., imsize[1]/2.],
[ 0., 0., 1.]])
distCoeffsInit = np.zeros((5,1))
flags = (cv2.CALIB_USE_INTRINSIC_GUESS + cv2.CALIB_RATIONAL_MODEL)
(ret, camera_matrix, distortion_coefficients0,
rotation_vectors, translation_vectors,
stdDeviationsIntrinsics, stdDeviationsExtrinsics,
perViewErrors) = cv2.aruco.calibrateCameraCharucoExtended(
charucoCorners=allCorners,
charucoIds=allIds,
board=board,
imageSize=imsize,
cameraMatrix=cameraMatrixInit,
distCoeffs=distCoeffsInit,
flags=flags,
criteria=(cv2.TERM_CRITERIA_EPS & cv2.TERM_CRITERIA_COUNT, 10000, 1e-9))
return ret, camera_matrix, distortion_coefficients0, rotation_vectors, translation_vectors
print("finished")
%%time
ret, mtx, dist, rvecs, tvecs = calibrate_camera(allCorners,allIds,imsize)
ret
CAMERA CALIBRATION
Wall time: 12min 46s
mtx
array([[ 1.46963466e+03, 0.00000000e+00, 2.63094117e+02],
[ 0.00000000e+00, 1.47297770e+03, 3.19127464e+02],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
dist
array([[ -4.15557150e+00],
[ 8.04563425e+02],
[ 1.72644822e-01],
[ -4.62914356e-02],
[ -1.41439828e+04],
[ 4.99936408e+00],
[ -2.89968864e+02],
[ 1.96691829e+04],
[ 0.00000000e+00],
[ 0.00000000e+00],
[ 0.00000000e+00],
[ 0.00000000e+00],
[ 0.00000000e+00],
[ 0.00000000e+00]])
np.savetxt(imagesFolder+"calib_mtx_webcam.csv", mtx)
np.savetxt(imagesFolder+"calib_dist_webcam.csv", dist)
Check calibration¶
i=24 # select image id
plt.figure()
frame = cv2.imread(imagesFolder + "image_100.jpg".format(i))
img_undist = cv2.undistort(frame,mtx,dist,None)
plt.subplot(211)
plt.imshow(frame)
plt.title("Raw image")
plt.axis("off")
plt.subplot(212)
plt.imshow(img_undist)
plt.title("Corrected image")
plt.axis("off")
plt.show()
<IPython.core.display.Javascript object>
Use of camera calibration to estimate 3D translation and rotation of each marker on a scene¶
frame = cv2.imread(imagesFolder + "image_10.jpg")
plt.figure()
plt.imshow(frame)
plt.show()
<IPython.core.display.Javascript object>
Post processing¶
%%time
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
parameters = aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
frame_markers = aruco.drawDetectedMarkers(frame.copy(), corners, ids)
Wall time: 38.1 ms
Result¶
conn = np.array([0, 1, 2, 3, 0])
plt.figure()
plt.imshow(frame_markers)
plt.legend()
plt.show()
<IPython.core.display.Javascript object>
No handles with labels found to put in legend.
Add local axis on each maker¶
size_of_marker = 0.0145 # side lenght of the marker in meter
rvecs,tvecs, trash = aruco.estimatePoseSingleMarkers(corners, size_of_marker , mtx, dist)
tvecs
array([[[ 0.03625717, 0.04684617, 0.46653871]],
[[ 0.07796683, 0.00174052, 0.44514342]],
[[ 0.0131153 , -0.02022943, 0.44694283]],
[[-0.11509333, -0.02061886, 0.4465331 ]],
[[ 0.07544442, -0.0398416 , 0.43262915]],
[[ 0.09802467, -0.06131984, 0.44035666]],
[[ 0.05448294, -0.06054667, 0.4326234 ]],
[[ 0.05369867, 0.0631415 , 0.42116605]],
[[-0.11193155, 0.06244439, 0.427018 ]],
[[ 0.05551877, 0.02247846, 0.43705436]],
[[ 0.05492523, -0.01945728, 0.43442988]],
[[-0.00789508, -0.03981689, 0.42867534]],
[[-0.07027212, -0.06136102, 0.43652852]],
[[ 0.07773333, 0.08803092, 0.43954609]],
[[ 0.03309225, 0.08473541, 0.42561175]],
[[-0.0083905 , 0.08445285, 0.42618681]],
[[-0.05225633, 0.08741113, 0.4432211 ]],
[[-0.09553183, 0.08714634, 0.44444085]],
[[ 0.09551237, 0.06367101, 0.42236155]],
[[ 0.01270016, 0.0654016 , 0.43867211]],
[[-0.02963197, 0.06396202, 0.4309523 ]],
[[-0.07063805, 0.06274348, 0.42591115]],
[[ 0.07741211, 0.04443328, 0.43943835]],
[[-0.00828486, 0.04297415, 0.42962259]],
[[-0.05158105, 0.04377289, 0.44160457]],
[[-0.09398191, 0.04328224, 0.44114026]],
[[ 0.09948571, 0.02302646, 0.44172269]],
[[ 0.01301304, 0.02262962, 0.44414953]],
[[-0.02986066, 0.02198689, 0.4362466 ]],
[[-0.07277628, 0.02201956, 0.44309408]],
[[-0.11713915, 0.0219428 , 0.45057945]],
[[ 0.03385166, 0.00165063, 0.43509877]],
[[-0.00814628, 0.00132911, 0.42935713]],
[[-0.05144476, 0.00123526, 0.44487906]],
[[-0.09568427, 0.00092015, 0.45336912]],
[[ 0.10089582, -0.01985325, 0.45093768]],
[[-0.02939441, -0.0199319 , 0.4364838 ]],
[[-0.07200425, -0.0203373 , 0.44242592]],
[[-0.05016834, -0.04077952, 0.43744884]],
[[-0.0918302 , -0.04095322, 0.43837771]],
[[ 0.01312589, -0.06296745, 0.44912868]],
[[-0.0291022 , -0.06147094, 0.4378132 ]],
[[-0.11297562, -0.0621073 , 0.44228741]]])
tvecs.shape
(43, 1, 3)
np.degrees(rvecs)
array([[[ 1.62516394e+02, 2.46355609e+00, -1.09402896e+01]],
[[ 1.79457420e+02, 7.19277484e-02, -1.32140582e+00]],
[[ 1.77773147e+02, -9.91113450e-01, 5.53146653e+00]],
[[ -1.85403347e+02, -2.23002873e-01, 1.24063729e+01]],
[[ 1.81444729e+02, -7.25485937e-01, 1.04275177e+01]],
[[ 1.77398449e+02, -2.71016859e-01, 7.89579400e+00]],
[[ 1.73242093e+02, 1.79338050e+00, -5.06408000e+00]],
[[ 1.66617310e+02, -7.61331890e-01, -1.96025399e+01]],
[[ -1.79129608e+02, -4.21227613e+00, -6.45245428e+01]],
[[ 1.81282644e+02, -1.57056435e-01, -6.86839568e-01]],
[[ 1.65840660e+02, 9.53216792e-01, -4.33656312e+00]],
[[ 1.76040502e+02, 1.50523348e+00, -1.30437940e+01]],
[[ 1.72773893e+02, 9.89154542e-01, -6.18063691e+00]],
[[ -1.83491628e+02, -2.23552817e+00, -8.18637179e-01]],
[[ -1.76798040e+02, -1.43834284e+00, 2.15416822e-01]],
[[ -1.77092833e+02, 2.28512214e-02, 6.79815955e-01]],
[[ -1.91819997e+02, -4.62989175e+00, -2.72407766e+01]],
[[ -1.88598008e+02, -4.31571915e+00, -4.45937173e+01]],
[[ 1.72422229e+02, 2.36525196e+00, 1.21332142e+01]],
[[ 1.70530658e+02, 9.57492283e-01, -7.11983884e+00]],
[[ -1.87682503e+02, -2.04001941e+00, -3.27632552e+00]],
[[ 1.72237634e+02, 2.40773992e-01, -7.26850888e+00]],
[[ 1.76200826e+02, 2.12251694e+00, 8.50244737e+00]],
[[ -1.70882183e+02, -1.02785140e+00, -1.36475536e+00]],
[[ 1.66528971e+02, 7.38399741e-01, 2.02590218e+01]],
[[ 1.74711765e+02, 6.94637499e-01, -1.47345906e+01]],
[[ -1.82368806e+02, -8.91134423e-01, -3.14684799e+00]],
[[ -1.79633708e+02, -8.69525993e-01, 1.46194101e+01]],
[[ -1.71473555e+02, -2.21806078e+00, -5.66001095e+00]],
[[ 1.83622188e+02, 2.59067337e+00, 1.22927092e+01]],
[[ 1.74751206e+02, 7.16637262e-01, -3.74674508e+00]],
[[ 1.93004493e+02, -5.16294249e-01, -1.14421246e+01]],
[[ 1.63289047e+02, 5.75137737e-01, 3.98558399e-01]],
[[ 1.76744726e+02, 2.63313500e-01, -1.71716506e+01]],
[[ 1.78244412e+02, 1.48455510e+00, -4.94199360e+00]],
[[ -1.67227497e+02, 1.13991745e+00, 3.64310604e+01]],
[[ 1.96110861e+02, 1.20281778e+00, 4.91750442e+00]],
[[ -1.90395446e+02, -2.17143285e-01, -8.94562363e+00]],
[[ 1.80592357e+02, 2.08727304e+00, -2.16501956e+01]],
[[ 1.77081940e+02, 3.29046736e+00, -1.88123338e+01]],
[[ 1.86433786e+02, 2.42004714e+00, -2.39405027e+01]],
[[ -1.60978143e+02, -1.03801207e-01, -1.69359969e+01]],
[[ 1.74702391e+02, 3.89745168e+00, -1.58659988e+01]]])
length_of_axis = 0.01
imaxis = aruco.drawDetectedMarkers(frame.copy(), corners, ids)
for i in range(len(tvecs)):
imaxis = aruco.drawAxis(imaxis, mtx, dist, rvecs[i], tvecs[i], length_of_axis)
plt.figure()
plt.imshow(imaxis)
plt.show()
<IPython.core.display.Javascript object>
data=pd.DataFrame(data=tvecs.reshape(43,3),columns=["tx","ty","tz"],index=ids.flatten())
data.index.name="makers"
data.sort_index(inplace=True)
data
tx | ty | tz | |
---|---|---|---|
makers | |||
0 | -0.112976 | -0.062107 | 0.442287 |
1 | -0.070272 | -0.061361 | 0.436529 |
2 | -0.029102 | -0.061471 | 0.437813 |
3 | 0.013126 | -0.062967 | 0.449129 |
4 | 0.054483 | -0.060547 | 0.432623 |
5 | 0.098025 | -0.061320 | 0.440357 |
6 | -0.091830 | -0.040953 | 0.438378 |
7 | -0.050168 | -0.040780 | 0.437449 |
8 | -0.007895 | -0.039817 | 0.428675 |
10 | 0.075444 | -0.039842 | 0.432629 |
11 | -0.115093 | -0.020619 | 0.446533 |
12 | -0.072004 | -0.020337 | 0.442426 |
13 | -0.029394 | -0.019932 | 0.436484 |
14 | 0.013115 | -0.020229 | 0.446943 |
15 | 0.054925 | -0.019457 | 0.434430 |
16 | 0.100896 | -0.019853 | 0.450938 |
17 | -0.095684 | 0.000920 | 0.453369 |
18 | -0.051445 | 0.001235 | 0.444879 |
19 | -0.008146 | 0.001329 | 0.429357 |
20 | 0.033852 | 0.001651 | 0.435099 |
21 | 0.077967 | 0.001741 | 0.445143 |
22 | -0.117139 | 0.021943 | 0.450579 |
23 | -0.072776 | 0.022020 | 0.443094 |
24 | -0.029861 | 0.021987 | 0.436247 |
25 | 0.013013 | 0.022630 | 0.444150 |
26 | 0.055519 | 0.022478 | 0.437054 |
27 | 0.099486 | 0.023026 | 0.441723 |
28 | -0.093982 | 0.043282 | 0.441140 |
29 | -0.051581 | 0.043773 | 0.441605 |
30 | -0.008285 | 0.042974 | 0.429623 |
31 | 0.036257 | 0.046846 | 0.466539 |
32 | 0.077412 | 0.044433 | 0.439438 |
33 | -0.111932 | 0.062444 | 0.427018 |
34 | -0.070638 | 0.062743 | 0.425911 |
35 | -0.029632 | 0.063962 | 0.430952 |
36 | 0.012700 | 0.065402 | 0.438672 |
37 | 0.053699 | 0.063141 | 0.421166 |
38 | 0.095512 | 0.063671 | 0.422362 |
39 | -0.095532 | 0.087146 | 0.444441 |
40 | -0.052256 | 0.087411 | 0.443221 |
41 | -0.008390 | 0.084453 | 0.426187 |
42 | 0.033092 | 0.084735 | 0.425612 |
43 | 0.077733 | 0.088031 | 0.439546 |
p=data.values
((p[1]-p[0])**2.).sum()**.5,((p[2]-p[1])**2.).sum()**.5,((p[3]-p[2])**2.).sum()**.5
(0.04309652659780655, 0.041190101023714003, 0.043743470242086288)
((data.loc[11]-data.loc[0]).values**2).sum()
0.001743801337263979
V0_1= p[1]-p[0]
V0_11=p[11]-p[0]
V0_1,V0_11
(array([ 0.0427035 , 0.00074629, -0.00575889]),
array([ 0.04097137, 0.04177 , 0.00013852]))
np.dot(V0_1,V0_11)
0.0017799953347752665
fig=plt.figure()
ax= fig.add_subplot(1,1,1)
ax.set_aspect("equal")
plt.plot(data.tx[:10], data.ty[:10],"or-")
plt.grid()
plt.show()
<IPython.core.display.Javascript object>
data.tx
corners=np.array(corners)
data2=pd.DataFrame({"px":corners[:,0,0,1],"py":corners[:,0,0,0]},index=ids.flatten())
data2.sort_index(inplace=True)
data2
px | py | |
---|---|---|
0 | 229.0 | 335.0 |
1 | 230.0 | 465.0 |
2 | 230.0 | 595.0 |
3 | 231.0 | 729.0 |
4 | 231.0 | 861.0 |
5 | 232.0 | 995.0 |
6 | 316.0 | 399.0 |
7 | 317.0 | 530.0 |
8 | 318.0 | 662.0 |
10 | 319.0 | 928.0 |
11 | 405.0 | 331.0 |
12 | 405.0 | 462.0 |
13 | 406.0 | 594.0 |
14 | 407.0 | 728.0 |
15 | 408.0 | 861.0 |
16 | 409.0 | 996.0 |
17 | 494.0 | 396.0 |
18 | 495.0 | 529.0 |
19 | 496.0 | 661.0 |
20 | 497.0 | 794.0 |
21 | 497.0 | 929.0 |
22 | 580.0 | 328.0 |
23 | 581.0 | 460.0 |
24 | 582.0 | 593.0 |
25 | 583.0 | 728.0 |
26 | 584.0 | 862.0 |
27 | 585.0 | 998.0 |
28 | 670.0 | 394.0 |
29 | 672.0 | 526.0 |
30 | 673.0 | 660.0 |
31 | 676.0 | 796.0 |
32 | 675.0 | 931.0 |
33 | 758.0 | 324.0 |
34 | 760.0 | 458.0 |
35 | 761.0 | 592.0 |
36 | 762.0 | 728.0 |
37 | 764.0 | 862.0 |
38 | 765.0 | 999.0 |
39 | 851.0 | 390.0 |
40 | 852.0 | 525.0 |
41 | 854.0 | 659.0 |
42 | 855.0 | 794.0 |
43 | 857.0 | 931.0 |
n0=data2.loc[0]
n1=data2.loc[1]
d01=((n0-n1).values**2).sum()**.5
d=42.5e-3
factor=d/d01
data2["x"]=data2.px*factor
data2["y"]=data2.py*factor
d1_0=data2.loc[2].y-data2.loc[1].y
d11_0=data2.loc[11].x-data2.loc[0].x
d1_0
0.042498738
d11_0
0.057536766
imagesFolder = "E:\Desktop\S8\Projet 851\data"
dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
board = cv2.aruco.CharucoBoard_create(3,3,.025,.0125,dictionary)
img = board.draw((200*3,200*3))
cv2.imwrite(imagesFolder + '\charucotest.png',img)
True
help (aruco)
Help on module cv2.aruco in cv2: NAME cv2.aruco FUNCTIONS Board_create(...) Board_create(objPoints, dictionary, ids) -> retval . * @brief Provide way to create Board by passing nessesary data. Specially needed in Python. . * . * @param objPoints array of object points of all the marker corners in the board . * @param dictionary the dictionary of markers employed for this board . * @param ids vector of the identifiers of the markers in the board . * CharucoBoard_create(...) CharucoBoard_create(squaresX, squaresY, squareLength, markerLength, dictionary) -> retval . * @brief Create a CharucoBoard object . * . * @param squaresX number of chessboard squares in X direction . * @param squaresY number of chessboard squares in Y direction . * @param squareLength chessboard square side length (normally in meters) . * @param markerLength marker side length (same unit than squareLength) . * @param dictionary dictionary of markers indicating the type of markers. . * The first markers in the dictionary are used to fill the white chessboard squares. . * @return the output CharucoBoard object . * . * This functions creates a CharucoBoard object given the number of squares in each direction . * and the size of the markers and chessboard squares. DetectorParameters_create(...) DetectorParameters_create() -> retval . Dictionary_create(...) Dictionary_create(nMarkers, markerSize) -> retval . * @see generateCustomDictionary Dictionary_create_from(...) Dictionary_create_from(nMarkers, markerSize, baseDictionary) -> retval . * @see generateCustomDictionary Dictionary_get(...) Dictionary_get(dict) -> retval . * @see getPredefinedDictionary GridBoard_create(...) GridBoard_create(markersX, markersY, markerLength, markerSeparation, dictionary[, firstMarker]) -> retval . * @brief Create a GridBoard object . * . * @param markersX number of markers in X direction . * @param markersY number of markers in Y direction . * @param markerLength marker side length (normally in meters) . * @param markerSeparation separation between two markers (same unit as markerLength) . * @param dictionary dictionary of markers indicating the type of markers . * @param firstMarker id of first marker in dictionary to use on board. . * @return the output GridBoard object . * . * This functions creates a GridBoard object given the number of markers in each direction and . * the marker size and marker separation. calibrateCameraAruco(...) calibrateCameraAruco(corners, ids, counter, board, imageSize, cameraMatrix, distCoeffs[, rvecs[, tvecs[, flags[, criteria]]]]) -> retval, cameraMatrix, distCoeffs, rvecs, tvecs . @brief It's the same function as #calibrateCameraAruco but without calibration error estimation. calibrateCameraArucoExtended(...) calibrateCameraArucoExtended(corners, ids, counter, board, imageSize, cameraMatrix, distCoeffs[, rvecs[, tvecs[, stdDeviationsIntrinsics[, stdDeviationsExtrinsics[, perViewErrors[, flags[, criteria]]]]]]]) -> retval, cameraMatrix, distCoeffs, rvecs, tvecs, stdDeviationsIntrinsics, stdDeviationsExtrinsics, perViewErrors . * @brief Calibrate a camera using aruco markers . * . * @param corners vector of detected marker corners in all frames. . * The corners should have the same format returned by detectMarkers (see #detectMarkers). . * @param ids list of identifiers for each marker in corners . * @param counter number of markers in each frame so that corners and ids can be split . * @param board Marker Board layout . * @param imageSize Size of the image used only to initialize the intrinsic camera matrix. . * @param cameraMatrix Output 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . If CV_CALIB_USE_INTRINSIC_GUESS . * and/or CV_CALIB_FIX_ASPECT_RATIO are specified, some or all of fx, fy, cx, cy must be . * initialized before calling the function. . * @param distCoeffs Output vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param rvecs Output vector of rotation vectors (see Rodrigues ) estimated for each board view . * (e.g. std::vector<cv::Mat>>). That is, each k-th rotation vector together with the corresponding . * k-th translation vector (see the next output parameter description) brings the board pattern . * from the model coordinate space (in which object points are specified) to the world coordinate . * space, that is, a real position of the board pattern in the k-th pattern view (k=0.. M -1). . * @param tvecs Output vector of translation vectors estimated for each pattern view. . * @param stdDeviationsIntrinsics Output vector of standard deviations estimated for intrinsic parameters. . * Order of deviations values: . * f$(f_x, f_y, c_x, c_y, k_1, k_2, p_1, p_2, k_3, k_4, k_5, k_6 , s_1, s_2, s_3, . * s_4, tau_x, tau_y)f$ If one of parameters is not estimated, it's deviation is equals to zero. . * @param stdDeviationsExtrinsics Output vector of standard deviations estimated for extrinsic parameters. . * Order of deviations values: f$(R_1, T_1, dotsc , R_M, T_M)f$ where M is number of pattern views, . * f$R_i, T_if$ are concatenated 1x3 vectors. . * @param perViewErrors Output vector of average re-projection errors estimated for each pattern view. . * @param flags flags Different flags for the calibration process (see #calibrateCamera for details). . * @param criteria Termination criteria for the iterative optimization algorithm. . * . * This function calibrates a camera using an Aruco Board. The function receives a list of . * detected markers from several views of the Board. The process is similar to the chessboard . * calibration in calibrateCamera(). The function returns the final re-projection error. calibrateCameraCharuco(...) calibrateCameraCharuco(charucoCorners, charucoIds, board, imageSize, cameraMatrix, distCoeffs[, rvecs[, tvecs[, flags[, criteria]]]]) -> retval, cameraMatrix, distCoeffs, rvecs, tvecs . @brief It's the same function as #calibrateCameraCharuco but without calibration error estimation. calibrateCameraCharucoExtended(...) calibrateCameraCharucoExtended(charucoCorners, charucoIds, board, imageSize, cameraMatrix, distCoeffs[, rvecs[, tvecs[, stdDeviationsIntrinsics[, stdDeviationsExtrinsics[, perViewErrors[, flags[, criteria]]]]]]]) -> retval, cameraMatrix, distCoeffs, rvecs, tvecs, stdDeviationsIntrinsics, stdDeviationsExtrinsics, perViewErrors . * @brief Calibrate a camera using Charuco corners . * . * @param charucoCorners vector of detected charuco corners per frame . * @param charucoIds list of identifiers for each corner in charucoCorners per frame . * @param board Marker Board layout . * @param imageSize input image size . * @param cameraMatrix Output 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . If CV_CALIB_USE_INTRINSIC_GUESS . * and/or CV_CALIB_FIX_ASPECT_RATIO are specified, some or all of fx, fy, cx, cy must be . * initialized before calling the function. . * @param distCoeffs Output vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param rvecs Output vector of rotation vectors (see Rodrigues ) estimated for each board view . * (e.g. std::vector<cv::Mat>>). That is, each k-th rotation vector together with the corresponding . * k-th translation vector (see the next output parameter description) brings the board pattern . * from the model coordinate space (in which object points are specified) to the world coordinate . * space, that is, a real position of the board pattern in the k-th pattern view (k=0.. M -1). . * @param tvecs Output vector of translation vectors estimated for each pattern view. . * @param stdDeviationsIntrinsics Output vector of standard deviations estimated for intrinsic parameters. . * Order of deviations values: . * f$(f_x, f_y, c_x, c_y, k_1, k_2, p_1, p_2, k_3, k_4, k_5, k_6 , s_1, s_2, s_3, . * s_4, tau_x, tau_y)f$ If one of parameters is not estimated, it's deviation is equals to zero. . * @param stdDeviationsExtrinsics Output vector of standard deviations estimated for extrinsic parameters. . * Order of deviations values: f$(R_1, T_1, dotsc , R_M, T_M)f$ where M is number of pattern views, . * f$R_i, T_if$ are concatenated 1x3 vectors. . * @param perViewErrors Output vector of average re-projection errors estimated for each pattern view. . * @param flags flags Different flags for the calibration process (see #calibrateCamera for details). . * @param criteria Termination criteria for the iterative optimization algorithm. . * . * This function calibrates a camera using a set of corners of a Charuco Board. The function . * receives a list of detected corners and its identifiers from several views of the Board. . * The function returns the final re-projection error. custom_dictionary(...) custom_dictionary(nMarkers, markerSize) -> retval . * @see generateCustomDictionary custom_dictionary_from(...) custom_dictionary_from(nMarkers, markerSize, baseDictionary) -> retval . * @brief Generates a new customizable marker dictionary . * . * @param nMarkers number of markers in the dictionary . * @param markerSize number of bits per dimension of each markers . * @param baseDictionary Include the markers in this dictionary at the beginning (optional) . * . * This function creates a new dictionary composed by nMarkers markers and each markers composed . * by markerSize x markerSize bits. If baseDictionary is provided, its markers are directly . * included and the rest are generated based on them. If the size of baseDictionary is higher . * than nMarkers, only the first nMarkers in baseDictionary are taken and no new marker is added. detectCharucoDiamond(...) detectCharucoDiamond(image, markerCorners, markerIds, squareMarkerLengthRate[, diamondCorners[, diamondIds[, cameraMatrix[, distCoeffs]]]]) -> diamondCorners, diamondIds . * @brief Detect ChArUco Diamond markers . * . * @param image input image necessary for corner subpixel. . * @param markerCorners list of detected marker corners from detectMarkers function. . * @param markerIds list of marker ids in markerCorners. . * @param squareMarkerLengthRate rate between square and marker length: . * squareMarkerLengthRate = squareLength/markerLength. The real units are not necessary. . * @param diamondCorners output list of detected diamond corners (4 corners per diamond). The order . * is the same than in marker corners: top left, top right, bottom right and bottom left. Similar . * format than the corners returned by detectMarkers (e.g std::vector<std::vector<cv::Point2f> > ). . * @param diamondIds ids of the diamonds in diamondCorners. The id of each diamond is in fact of . * type Vec4i, so each diamond has 4 ids, which are the ids of the aruco markers composing the . * diamond. . * @param cameraMatrix Optional camera calibration matrix. . * @param distCoeffs Optional camera distortion coefficients. . * . * This function detects Diamond markers from the previous detected ArUco markers. The diamonds . * are returned in the diamondCorners and diamondIds parameters. If camera calibration parameters . * are provided, the diamond search is based on reprojection. If not, diamond search is based on . * homography. Homography is faster than reprojection but can slightly reduce the detection rate. detectMarkers(...) detectMarkers(image, dictionary[, corners[, ids[, parameters[, rejectedImgPoints[, cameraMatrix[, distCoeff]]]]]]) -> corners, ids, rejectedImgPoints . * @brief Basic marker detection . * . * @param image input image . * @param dictionary indicates the type of markers that will be searched . * @param corners vector of detected marker corners. For each marker, its four corners . * are provided, (e.g std::vector<std::vector<cv::Point2f> > ). For N detected markers, . * the dimensions of this array is Nx4. The order of the corners is clockwise. . * @param ids vector of identifiers of the detected markers. The identifier is of type int . * (e.g. std::vector<int>). For N detected markers, the size of ids is also N. . * The identifiers have the same order than the markers in the imgPoints array. . * @param parameters marker detection parameters . * @param rejectedImgPoints contains the imgPoints of those squares whose inner code has not a . * correct codification. Useful for debugging purposes. . * @param cameraMatrix optional input 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeff optional vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * . * Performs marker detection in the input image. Only markers included in the specific dictionary . * are searched. For each detected marker, it returns the 2D position of its corner in the image . * and its corresponding identifier. . * Note that this function does not perform pose estimation. . * @sa estimatePoseSingleMarkers, estimatePoseBoard . * drawAxis(...) drawAxis(image, cameraMatrix, distCoeffs, rvec, tvec, length) -> image . * @brief Draw coordinate system axis from pose estimation . * . * @param image input/output image. It must have 1 or 3 channels. The number of channels is not . * altered. . * @param cameraMatrix input 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeffs vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param rvec rotation vector of the coordinate system that will be drawn. (@sa Rodrigues). . * @param tvec translation vector of the coordinate system that will be drawn. . * @param length length of the painted axis in the same unit than tvec (usually in meters) . * . * Given the pose estimation of a marker or board, this function draws the axis of the world . * coordinate system, i.e. the system centered on the marker/board. Useful for debugging purposes. drawDetectedCornersCharuco(...) drawDetectedCornersCharuco(image, charucoCorners[, charucoIds[, cornerColor]]) -> image . * @brief Draws a set of Charuco corners . * @param image input/output image. It must have 1 or 3 channels. The number of channels is not . * altered. . * @param charucoCorners vector of detected charuco corners . * @param charucoIds list of identifiers for each corner in charucoCorners . * @param cornerColor color of the square surrounding each corner . * . * This function draws a set of detected Charuco corners. If identifiers vector is provided, it also . * draws the id of each corner. drawDetectedDiamonds(...) drawDetectedDiamonds(image, diamondCorners[, diamondIds[, borderColor]]) -> image . * @brief Draw a set of detected ChArUco Diamond markers . * . * @param image input/output image. It must have 1 or 3 channels. The number of channels is not . * altered. . * @param diamondCorners positions of diamond corners in the same format returned by . * detectCharucoDiamond(). (e.g std::vector<std::vector<cv::Point2f> > ). For N detected markers, . * the dimensions of this array should be Nx4. The order of the corners should be clockwise. . * @param diamondIds vector of identifiers for diamonds in diamondCorners, in the same format . * returned by detectCharucoDiamond() (e.g. std::vector<Vec4i>). . * Optional, if not provided, ids are not painted. . * @param borderColor color of marker borders. Rest of colors (text color and first corner color) . * are calculated based on this one. . * . * Given an array of detected diamonds, this functions draws them in the image. The marker borders . * are painted and the markers identifiers if provided. . * Useful for debugging purposes. drawDetectedMarkers(...) drawDetectedMarkers(image, corners[, ids[, borderColor]]) -> image . * @brief Draw detected markers in image . * . * @param image input/output image. It must have 1 or 3 channels. The number of channels is not . * altered. . * @param corners positions of marker corners on input image. . * (e.g std::vector<std::vector<cv::Point2f> > ). For N detected markers, the dimensions of . * this array should be Nx4. The order of the corners should be clockwise. . * @param ids vector of identifiers for markers in markersCorners . . * Optional, if not provided, ids are not painted. . * @param borderColor color of marker borders. Rest of colors (text color and first corner color) . * are calculated based on this one to improve visualization. . * . * Given an array of detected marker corners and its corresponding ids, this functions draws . * the markers in the image. The marker borders are painted and the markers identifiers if provided. . * Useful for debugging purposes. drawMarker(...) drawMarker(dictionary, id, sidePixels[, img[, borderBits]]) -> img . * @brief Draw a canonical marker image . * . * @param dictionary dictionary of markers indicating the type of markers . * @param id identifier of the marker that will be returned. It has to be a valid id . * in the specified dictionary. . * @param sidePixels size of the image in pixels . * @param img output image with the marker . * @param borderBits width of the marker border. . * . * This function returns a marker image in its canonical form (i.e. ready to be printed) drawPlanarBoard(...) drawPlanarBoard(board, outSize[, img[, marginSize[, borderBits]]]) -> img . * @brief Draw a planar board . * @sa _drawPlanarBoardImpl . * . * @param board layout of the board that will be drawn. The board should be planar, . * z coordinate is ignored . * @param outSize size of the output image in pixels. . * @param img output image with the board. The size of this image will be outSize . * and the board will be on the center, keeping the board proportions. . * @param marginSize minimum margins (in pixels) of the board in the output image . * @param borderBits width of the marker borders. . * . * This function return the image of a planar board, ready to be printed. It assumes . * the Board layout specified is planar by ignoring the z coordinates of the object points. estimatePoseBoard(...) estimatePoseBoard(corners, ids, board, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess]]]) -> retval, rvec, tvec . * @brief Pose estimation for a board of markers . * . * @param corners vector of already detected markers corners. For each marker, its four corners . * are provided, (e.g std::vector<std::vector<cv::Point2f> > ). For N detected markers, the . * dimensions of this array should be Nx4. The order of the corners should be clockwise. . * @param ids list of identifiers for each marker in corners . * @param board layout of markers in the board. The layout is composed by the marker identifiers . * and the positions of each marker corner in the board reference system. . * @param cameraMatrix input 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeffs vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param rvec Output vector (e.g. cv::Mat) corresponding to the rotation vector of the board . * (see cv::Rodrigues). Used as initial guess if not empty. . * @param tvec Output vector (e.g. cv::Mat) corresponding to the translation vector of the board. . * @param useExtrinsicGuess defines whether initial guess for b rvec and b tvec will be used or not. . * Used as initial guess if not empty. . * . * This function receives the detected markers and returns the pose of a marker board composed . * by those markers. . * A Board of marker has a single world coordinate system which is defined by the board layout. . * The returned transformation is the one that transforms points from the board coordinate system . * to the camera coordinate system. . * Input markers that are not included in the board layout are ignored. . * The function returns the number of markers from the input employed for the board pose estimation. . * Note that returning a 0 means the pose has not been estimated. estimatePoseCharucoBoard(...) estimatePoseCharucoBoard(charucoCorners, charucoIds, board, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess]]]) -> retval, rvec, tvec . * @brief Pose estimation for a ChArUco board given some of their corners . * @param charucoCorners vector of detected charuco corners . * @param charucoIds list of identifiers for each corner in charucoCorners . * @param board layout of ChArUco board. . * @param cameraMatrix input 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeffs vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param rvec Output vector (e.g. cv::Mat) corresponding to the rotation vector of the board . * (see cv::Rodrigues). . * @param tvec Output vector (e.g. cv::Mat) corresponding to the translation vector of the board. . * @param useExtrinsicGuess defines whether initial guess for b rvec and b tvec will be used or not. . * . * This function estimates a Charuco board pose from some detected corners. . * The function checks if the input corners are enough and valid to perform pose estimation. . * If pose estimation is valid, returns true, else returns false. estimatePoseSingleMarkers(...) estimatePoseSingleMarkers(corners, markerLength, cameraMatrix, distCoeffs[, rvecs[, tvecs[, _objPoints]]]) -> rvecs, tvecs, _objPoints . * @brief Pose estimation for single markers . * . * @param corners vector of already detected markers corners. For each marker, its four corners . * are provided, (e.g std::vector<std::vector<cv::Point2f> > ). For N detected markers, . * the dimensions of this array should be Nx4. The order of the corners should be clockwise. . * @sa detectMarkers . * @param markerLength the length of the markers' side. The returning translation vectors will . * be in the same unit. Normally, unit is meters. . * @param cameraMatrix input 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeffs vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param rvecs array of output rotation vectors (@sa Rodrigues) (e.g. std::vector<cv::Vec3d>). . * Each element in rvecs corresponds to the specific marker in imgPoints. . * @param tvecs array of output translation vectors (e.g. std::vector<cv::Vec3d>). . * Each element in tvecs corresponds to the specific marker in imgPoints. . * @param _objPoints array of object points of all the marker corners . * . * This function receives the detected markers and returns their pose estimation respect to . * the camera individually. So for each marker, one rotation and translation vector is returned. . * The returned transformation is the one that transforms points from each marker coordinate system . * to the camera coordinate system. . * The marker corrdinate system is centered on the middle of the marker, with the Z axis . * perpendicular to the marker plane. . * The coordinates of the four corners of the marker in its own coordinate system are: . * (-markerLength/2, markerLength/2, 0), (markerLength/2, markerLength/2, 0), . * (markerLength/2, -markerLength/2, 0), (-markerLength/2, -markerLength/2, 0) getBoardObjectAndImagePoints(...) getBoardObjectAndImagePoints(board, detectedCorners, detectedIds[, objPoints[, imgPoints]]) -> objPoints, imgPoints . * @brief Given a board configuration and a set of detected markers, returns the corresponding . * image points and object points to call solvePnP . * . * @param board Marker board layout. . * @param detectedCorners List of detected marker corners of the board. . * @param detectedIds List of identifiers for each marker. . * @param objPoints Vector of vectors of board marker points in the board coordinate space. . * @param imgPoints Vector of vectors of the projections of board marker corner points. getPredefinedDictionary(...) getPredefinedDictionary(dict) -> retval . * @brief Returns one of the predefined dictionaries referenced by DICT_*. interpolateCornersCharuco(...) interpolateCornersCharuco(markerCorners, markerIds, image, board[, charucoCorners[, charucoIds[, cameraMatrix[, distCoeffs[, minMarkers]]]]]) -> retval, charucoCorners, charucoIds . * @brief Interpolate position of ChArUco board corners . * @param markerCorners vector of already detected markers corners. For each marker, its four . * corners are provided, (e.g std::vector<std::vector<cv::Point2f> > ). For N detected markers, the . * dimensions of this array should be Nx4. The order of the corners should be clockwise. . * @param markerIds list of identifiers for each marker in corners . * @param image input image necesary for corner refinement. Note that markers are not detected and . * should be sent in corners and ids parameters. . * @param board layout of ChArUco board. . * @param charucoCorners interpolated chessboard corners . * @param charucoIds interpolated chessboard corners identifiers . * @param cameraMatrix optional 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeffs optional vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param minMarkers number of adjacent markers that must be detected to return a charuco corner . * . * This function receives the detected markers and returns the 2D position of the chessboard corners . * from a ChArUco board using the detected Aruco markers. If camera parameters are provided, . * the process is based in an approximated pose estimation, else it is based on local homography. . * Only visible corners are returned. For each corner, its corresponding identifier is . * also returned in charucoIds. . * The function returns the number of interpolated corners. refineDetectedMarkers(...) refineDetectedMarkers(image, board, detectedCorners, detectedIds, rejectedCorners[, cameraMatrix[, distCoeffs[, minRepDistance[, errorCorrectionRate[, checkAllOrders[, recoveredIdxs[, parameters]]]]]]]) -> detectedCorners, detectedIds, rejectedCorners, recoveredIdxs . * @brief Refind not detected markers based on the already detected and the board layout . * . * @param image input image . * @param board layout of markers in the board. . * @param detectedCorners vector of already detected marker corners. . * @param detectedIds vector of already detected marker identifiers. . * @param rejectedCorners vector of rejected candidates during the marker detection process. . * @param cameraMatrix optional input 3x3 floating-point camera matrix . * f$A = vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}f$ . * @param distCoeffs optional vector of distortion coefficients . * f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])f$ of 4, 5, 8 or 12 elements . * @param minRepDistance minimum distance between the corners of the rejected candidate and the . * reprojected marker in order to consider it as a correspondence. . * @param errorCorrectionRate rate of allowed erroneous bits respect to the error correction . * capability of the used dictionary. -1 ignores the error correction step. . * @param checkAllOrders Consider the four posible corner orders in the rejectedCorners array. . * If it set to false, only the provided corner order is considered (default true). . * @param recoveredIdxs Optional array to returns the indexes of the recovered candidates in the . * original rejectedCorners array. . * @param parameters marker detection parameters . * . * This function tries to find markers that were not detected in the basic detecMarkers function. . * First, based on the current detected marker and the board layout, the function interpolates . * the position of the missing markers. Then it tries to find correspondence between the reprojected . * markers and the rejected candidates based on the minRepDistance and errorCorrectionRate . * parameters. . * If camera parameters and distortion coefficients are provided, missing markers are reprojected . * using projectPoint function. If not, missing marker projections are interpolated using global . * homography, and all the marker corners in the board must have the same Z coordinate. DATA CORNER_REFINE_CONTOUR = 2 CORNER_REFINE_NONE = 0 CORNER_REFINE_SUBPIX = 1 DICT_4X4_100 = 1 DICT_4X4_1000 = 3 DICT_4X4_250 = 2 DICT_4X4_50 = 0 DICT_5X5_100 = 5 DICT_5X5_1000 = 7 DICT_5X5_250 = 6 DICT_5X5_50 = 4 DICT_6X6_100 = 9 DICT_6X6_1000 = 11 DICT_6X6_250 = 10 DICT_6X6_50 = 8 DICT_7X7_100 = 13 DICT_7X7_1000 = 15 DICT_7X7_250 = 14 DICT_7X7_50 = 12 DICT_ARUCO_ORIGINAL = 16 FILE (built-in)
charucoCorners=allCorners,
charucoIds=allIds,
board=board,
imageSize=imsize,
cameraMatrix=cameraMatrixInit,
distCoeffs=distCoeffsInit,
flags=flags,
criteria=(cv2.TERM_CRITERIA_EPS & cv2.TERM_CRITERIA_COUNT, 10000, 1e-9)
help (aruco.calibrateCameraCharucoExtended)
Help on built-in function calibrateCameraCharuco:
calibrateCameraCharuco(...)
calibrateCameraCharuco(charucoCorners, charucoIds, board, imageSize, cameraMatrix, distCoeffs[, rvecs[, tvecs[, flags[, criteria]]]]) -> retval, cameraMatrix, distCoeffs, rvecs, tvecs
. @brief It's the same function as #calibrateCameraCharuco but without calibration error estimation.