4

OpenCV キャリブレーション サンプル (レンズ補正には問題なく機能します) で説明されているように、カメラのキャリブレーションを実行しています。さらに、空間補正を行いたいと考えています。カメラがチェッカーボードに平行でない場合、チェッカーボードをカメラに平行にするために必要な回転を取得したいと考えています。それは私がやっていることです:

// calculate intrinsic matrix and distortion coefficients for lens correction and get
// the rotation "rotation"
cvCalibrateCamera2(object_points,image_points,point_counts,cvGetSize(gray_image),
                   intrinsic_matrix, distortion_coeffs,
                   rotation,NULL,
                   0);
...
// convert the rotation to a 3x3 matrix
cv::Rodrigues(rotation,rotMtx,cv::noArray());
// generate maps for lens correction
cv::initUndistortRectifyMap(intrinsic,distortion,cv::Mat(),
                            cv::getOptimalNewCameraMatrix(intrinsic,distortion,imageSize,1,imageSize,0),
                                                         imageSize, CV_16SC2,*handle->mapx,*handle->mapy);
...
// perform lens correction
cv::remap(cv::Mat(sImage),dImage,*handle->mapx,*handle->mapy,cv::INTER_LINEAR);
...
// apply the rotation to make the mage parallel to the camera
cv::warpPerspective(dImage,dImage2,rotMtx,cv::Size(handle->width,handle->height),cv::INTER_LANCZOS4,cv::BORDER_TRANSPARENT,cv::Scalar());

cvCalibrateCamera2() によって返される回転 3x1 回転値は !=0 であるため、何かが返されます。ただし、 warpPerspective() は画像を回転しません。

ここで何が問題なのですか?画像を正しく「並列化」するにはどうすればよいですか?

4

1 に答える 1

2

この件についての私の理解から、画像を「平行化」するために使用している回転行列は、 2 つの画像平面間の回転を提供します。あなたが探しているのは、イメージ プレーンからカメラ プレーンへの変換です。これは、平面間のホモグラフィを計算することを要求します。イメージ プレーンからカメラ プレーンに移動する行列を特定する必要があります。この行列を使用して、画像を並列化します。

また、calibrationCameraは順変換を提供します。元に戻るには、マトリックスを反転する必要があります。

これを読んでみてください -ホモグラフィー

ヒント: 焦点距離と主点情報を使用して、画像とカメラの平面間を移動します。

于 2013-05-06T12:14:24.780 に答える