2013-01-25 25 views
15

उत्पन्न करता है मैं होमोग्राफी का उपयोग करके ब्लेंडर 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 

बहुत बहुत

+0

मैं, एक ही समस्या है मैं हालांकि एक भिन्न तरीके से उपयोग कर रहा हूँ। मुझे आशा है कि यहां कोई जवाब जवाब जानता है। http://stackoverflow.com/questions/14444433/calculate-camera-world-position-with-opencv-python –

+0

आपको अपने स्वयं के rot_matrix_to_euler की आवश्यकता नहीं है, रॉड्रिग्स आपके लिए यह करता है – Hammer

+0

ठीक है, b_m, तो ऐसा लगता है कि हम हैं एक ही नाव में हाहा। उम्मीद है कि कोई हमारी मदद करने में सक्षम होगा। मैं रॉड्रिग्स से सीधे यूलर कोण कैसे प्राप्त करूं? 3x1 रोटेशन वेक्टर मेरे लिए यूलर कोण के समान नहीं है। इसके अलावा, क्या मेरे इनपुट solPnP में सही हैं? क्या आप calibratecamera से आउटपुट का उपयोग करते हैं? – amartin7211

उत्तर

20

मुझे लगता है कि आप कैमरे की स्थिति के रूप में tvecs_new की सोच सकते धन्यवाद। थोड़ा उलझन में यह मामला नहीं है! वास्तव में यह कैमरा सह-समन्वय में दुनिया की उत्पत्ति की स्थिति है। कैमरा वस्तु/दुनिया सह ords मुद्रा प्राप्त करने के लिए, मैं तुम्हें करने की ज़रूरत का मानना ​​है:

-np.matrix(rotation_matrix).T * np.matrix(tvecs_new) 

और तुम यूलर cv2.decomposeProjectionMatrix(P)[-1] का उपयोग कर कोण जहां P[r|t] 3 से 4 बाह्य मैट्रिक्स है प्राप्त कर सकते हैं।

मैं this पाया intrinsics और extrinsics के बारे में एक बहुत अच्छा लेख बनने के लिए ...

+1

वाह! एक जादू की तरह काम करता है! बहुत बहुत धन्यवाद। मुझे अभी तक लेख तक नहीं मिला है (मैं योजना बना रहा हूं), लेकिन यह निश्चित रूप से परिणामों को तय करता है। मैं थोड़ा उलझन में हूं जिसका मतलब है "यह कैमरे के समन्वय में दुनिया की उत्पत्ति की स्थिति" है। कोई मौका आप उस पर संक्षिप्त रूप से विस्तार कर सकते हैं? कैमरा सह-समन्वय क्या हैं? इसके अलावा, विघटन के साथ प्राप्त यूलर कोण मेरे गणना किए गए यूलर कोणों के साथ मेल खाते हैं (हालांकि मैं ओपनसीवीएस कोड के साथ चिपकने वाला हूं) – amartin7211

+1

@ user1713402 - कूल :)।'कैमरा समन्वय प्रणाली' कैमरे कार्टेशियन समन्वय प्रणाली है, यह कैमरे के साथ चलता है, और कैमरा हमेशा उत्पत्ति पर होता है, जेड-अक्ष कैमरा दृश्य की दिशा है, वाई छवि है, और एक्स है सही। जबकि विश्व समन्वय प्रणाली स्थैतिक है, और कैमरा इसके भीतर चलता है। [हेरेस] (http://stackoverflow.com/questions/695043/how-does-one-convert-world-coordinates-to-camera-coordinates) एक और सवाल जो इसे थोड़ा और बताता है। – fraxel

+0

बढ़िया! यह समझ आता है! आपके द्वारा संदर्भित अच्छे आलेख के लिए एक बार फिर – amartin7211