उत्पन्न करता है मैं होमोग्राफी का उपयोग करके ब्लेंडर 3 डी में एक वर्चुअल कैमरा के स्थान और घूर्णन को कैलिब्रेट और ढूंढने का प्रयास कर रहा हूं। मैं ब्लेंडर का उपयोग कर रहा हूं ताकि मैं असली दुनिया में जाने से पहले अपने परिणामों की जांच कर सकूं जहां यह अधिक कठिन है। मैंने अपने स्थिर कैमरे के दृश्य में विभिन्न स्थानों और घूर्णन में शतरंज बोर्ड की दस तस्वीरें प्रस्तुत कीं। ओपनसीवी के अजगर के साथ, मैंने दस छवियों में शतरंज बोर्ड के ज्ञात कोनों से आंतरिक मैट्रिक्स को खोजने के लिए cv2.calibrate कैमरा का उपयोग किया और फिर बाहरी पैरामीटर (अनुवाद और रोटेशन) को खोजने के लिए cv2.solvePnP में इसका उपयोग किया। हालांकि, अनुमानित पैरामीटर वास्तविक लोगों के करीब थे, फिर भी कुछ ख़राब चल रहा है। अनुवाद का मेरा प्रारंभिक अनुमान था (-0.11205481, -0.0490256,8.138924 9 1)। वास्तविक स्थान (0,0,8.07105) था। बहुत करीब सही है? लेकिन जब मैंने कैमरे को थोड़ा घुमाया और घुमाया और छवियों को फिर से प्रस्तुत किया, तो अनुमानित अनुवाद दूर हो गया। अनुमानित: (-0.15933154,0.13367286,9.34058867)। वास्तविक: (-1.7 9 18, -1.51073,9.76597)। जेड मान करीब है, लेकिन एक्स और वाई नहीं हैं। मैं पूरी तरह उलझन में हूँ। अगर कोई मुझे इस तरह से हल करने में मदद कर सकता है, तो मैं बहुत आभारी रहूंगा। यहाँ कोड है (यह को Python2 जांच उदाहरण opencv के साथ आपूर्ति के आधार पर की गई हैं):पायथन ओपनसीवी सोलवेपीएनपी गलत अनुवाद वेक्टर
#imports left out
USAGE = '''
USAGE: calib.py [--save <filename>] [--debug <output path>] [--square_size] [<image mask>]
'''
args, img_mask = getopt.getopt(sys.argv[1:], '', ['save=', 'debug=', 'square_size='])
args = dict(args)
try: img_mask = img_mask[0]
except: img_mask = '../cpp/0*.png'
img_names = glob(img_mask)
debug_dir = args.get('--debug')
square_size = float(args.get('--square_size', 1.0))
pattern_size = (5, 8)
pattern_points = np.zeros((np.prod(pattern_size), 3), np.float32)
pattern_points[:,:2] = np.indices(pattern_size).T.reshape(-1, 2)
pattern_points *= square_size
obj_points = []
img_points = []
h, w = 0, 0
count = 0
for fn in img_names:
print 'processing %s...' % fn,
img = cv2.imread(fn, 0)
h, w = img.shape[:2]
found, corners = cv2.findChessboardCorners(img, pattern_size)
if found:
if count == 0:
#corners first is a list of the image points for just the first image.
#This is the image I know the object points for and use in solvePnP
corners_first = []
for val in corners:
corners_first.append(val[0])
np_corners_first = np.asarray(corners_first,np.float64)
count+=1
term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1)
cv2.cornerSubPix(img, corners, (5, 5), (-1, -1), term)
if debug_dir:
vis = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawChessboardCorners(vis, pattern_size, corners, found)
path, name, ext = splitfn(fn)
cv2.imwrite('%s/%s_chess.bmp' % (debug_dir, name), vis)
if not found:
print 'chessboard not found'
continue
img_points.append(corners.reshape(-1, 2))
obj_points.append(pattern_points)
print 'ok'
rms, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (w, h))
print "RMS:", rms
print "camera matrix:\n", camera_matrix
print "distortion coefficients: ", dist_coefs.ravel()
cv2.destroyAllWindows()
np_xyz = np.array(xyz,np.float64).T #xyz list is from file. Not shown here for brevity
camera_matrix2 = np.asarray(camera_matrix,np.float64)
np_dist_coefs = np.asarray(dist_coefs[:,:],np.float64)
found,rvecs_new,tvecs_new = cv2.solvePnP(np_xyz, np_corners_first,camera_matrix2,np_dist_coefs)
np_rodrigues = np.asarray(rvecs_new[:,:],np.float64)
print np_rodrigues.shape
rot_matrix = cv2.Rodrigues(np_rodrigues)[0]
def rot_matrix_to_euler(R):
y_rot = asin(R[2][0])
x_rot = acos(R[2][2]/cos(y_rot))
z_rot = acos(R[0][0]/cos(y_rot))
y_rot_angle = y_rot *(180/pi)
x_rot_angle = x_rot *(180/pi)
z_rot_angle = z_rot *(180/pi)
return x_rot_angle,y_rot_angle,z_rot_angle
print "Euler_rotation = ",rot_matrix_to_euler(rot_matrix)
print "Translation_Matrix = ", tvecs_new
बहुत बहुत
मैं, एक ही समस्या है मैं हालांकि एक भिन्न तरीके से उपयोग कर रहा हूँ। मुझे आशा है कि यहां कोई जवाब जवाब जानता है। http://stackoverflow.com/questions/14444433/calculate-camera-world-position-with-opencv-python –
आपको अपने स्वयं के rot_matrix_to_euler की आवश्यकता नहीं है, रॉड्रिग्स आपके लिए यह करता है – Hammer
ठीक है, b_m, तो ऐसा लगता है कि हम हैं एक ही नाव में हाहा। उम्मीद है कि कोई हमारी मदद करने में सक्षम होगा। मैं रॉड्रिग्स से सीधे यूलर कोण कैसे प्राप्त करूं? 3x1 रोटेशन वेक्टर मेरे लिए यूलर कोण के समान नहीं है। इसके अलावा, क्या मेरे इनपुट solPnP में सही हैं? क्या आप calibratecamera से आउटपुट का उपयोग करते हैं? – amartin7211