2016-12-01 1 views
0

2台のカメラを水平に(互いに近づけて)設置しました。私はカメラcam1とカメラcam2を残しました。"online"中に高いRMSエラーが発生しました。cv:stereoCalibration

まず、私は(私は画像の50組を校正したい)カメラを校正:

  1. 私はseparetely CVを使用して両方のカメラを校正:: calibrateCamera()
  2. 私はCVを使用してステレオを校正:: stereoCalibrate()

私の質問:stereoCalibrateで

  1. - 私は、カメラの順と仮定しデータは重要です。左のカメラからのデータがimagePoints1でなければならず、右のカメラからのデータがimagePoints2でなければならない、またはその逆であるか、プログラムのあらゆる点でカメラの順序が同じであれば問題はありませんか?
  2. ステレオキャリブレーションでは、RMSエラーは15,9319回、平均再投影エラーは約8,4536回になります。カメラからのすべての画像を使用すると、その値が得られます。他の場合:最初に画像を保存し、チェス盤全体が見える場所でペアを選択します(チェスボラードの四角形はすべてカメラビューにあり、すべての四角形が全体で表示されます)。これは、オフライン較正だけが良いことを意味し、カメラを較正したい場合は、手動で良好な画像を選択する必要がありますか?オンラインで校正を行う方法がいくつかありますか?オンラインでは、私はカメラからのキャプチャビューを開始し、すべてのビューでチェスボードコーナーを見つけ、カメラからのキャプチャビューを停止した後にカメラを較正することを意味します。
  3. 歪みの値は4つだけ必要ですが、そのうち5つはk3で取得します。古いAPIバージョンのcvStereoCalibrate2で​​は4つの値しか得られませんでしたが、cv :: stereoCalibrateではこれを行う方法がわかりません。それは可能ですか、または唯一の方法は5つの値を取得し、後でそれらの4つだけを使用することですか?

マイコード:

Mat cameraMatrix[2], distCoeffs[2]; 
distCoeffs[0] = Mat(4, 1, CV_64F); 
distCoeffs[1] = Mat(4, 1, CV_64F); 

vector<Mat> rvec1, rvec2, tvec1, tvec2; 

double rms1 = cv::calibrateCamera(objectPoints, imagePoints[0], imageSize, cameraMatrix[0], distCoeffs[0],rvec1, tvec1, CALIB_FIX_K3, TermCriteria(
            TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON)); 

double rms2 = cv::calibrateCamera(objectPoints, imagePoints[1], imageSize, cameraMatrix[1], distCoeffs[1],rvec2, tvec2, CALIB_FIX_K3, TermCriteria(
            TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON)); 

qDebug()<<"Rms1: "<<rms1; 
qDebug()<<"Rms2: "<<rms2; 

Mat R, T, E, F; 

double rms = cv::stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], 
    cameraMatrix[0], distCoeffs[0], 
    cameraMatrix[1], distCoeffs[1], 
    imageSize, R, T, E, F, 
    TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5), 
    CV_CALIB_FIX_INTRINSIC+ 
    CV_CALIB_SAME_FOCAL_LENGTH); 

答えて

0

私は同様の問題がありました。私の問題は、私が左のイメージと右のイメージを両方ともソートされていると仮定して読み込んでいたことでした。ここでは、Pythonのコードの一部 2行目で「ソート」を使用して修正しました。

images = glob.glob(path_left) 
for fname in sorted(images): 
    img = cv2.imread(fname) 
    gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    # Find the chess board corners 
    ret, corners1 = cv2.findChessboardCorners(gray1, (n, m), None) 
    # If found, add object points, image points (after refining them) 
    if ret == True: 
     i = i + 1 
     print("Cam1. Chess pattern was detected") 
     objpoints1.append(objp) 
     cv2.cornerSubPix(gray1, corners1, (5, 5), (-1, -1), criteria) 
     imgpoints1.append(corners1) 
     cv2.drawChessboardCorners(img, (n, m), corners1, ret) 
     cv2.imshow('img', img) 
     cv2.waitKey(100) 
関連する問題