4

したがって、私は OpenCV (2.1) に非常に慣れていないので、覚えておいてください。

そこで、私が使用している安価な Web カメラ (広角アタッチメント付き) を調整し、チェッカーボード キャリブレーション方法を使用して固有係数と歪み係数を生成しました。

その後、問題なくこれらの値をフィードバックしてイメージ マップを生成し、それをビデオ フィードに適用して受信イメージを修正します。

しかし、私は問題に遭遇します。画像をゆがめたり修正したりするときに、いくつかの歪んだセクションを作成し、画像をフォーマットして黒い領域を切り取ります。私の質問は、黒い領域のある領域を含めて、歪んだ画像全体を表示できるかということです。以下は、私の用語が間違っていた場合に伝えようとしていた、歪んだセクションを持つ黒い領域の例です。

私が話している地域をよりよく伝える画像はここにあります!この画像はこの投稿で発見されました。

現在: cvRemap() は、基本的に上記のリンクされた画像の黄色のボックスを返しますが、取得しようとしている関連データがあるため、画像全体を表示したいと考えています。

私が試したこと: イメージマップに縮尺変換を適用して、イメージ全体(引き伸ばされた部分を含む)をフレームに収める

        CvMat *intrinsic = (CvMat*)cvLoad( "Intrinsics.xml" );
        CvMat *distortion = (CvMat*)cvLoad( "Distortion.xml" );

        cvInitUndistortMap( intrinsic, distortion, mapx, mapy );

        cvConvertScale(mapx, mapx, 1.25, -shift_x);   // Some sort of scale conversion
        cvConvertScale(mapy, mapy, 1.25, -shift_y);   // applied to the image map

        cvRemap(distorted,undistorted,mapx,mapy);

cvConvertScale は、x/y シフトを正しく調整したと思うと (推測/チェック)、画像マップを何らかの形で歪め、修正を役に立たなくしています。ここにはいくつかの数学が含まれている可能性がありますが、私は正しく理解していません。

この問題を解決するための他の提案はありますか、それとも私が間違っている可能性がありますか? また、歪みの問題を修正するために独自のコードを作成しようとしましたが、OpenCV はそれをうまく行う方法を既に知っているとだけ言っておきましょう。

4

1 に答える 1

4

メモリから、を使用する必要があります。InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2)これInitUndistortMapは簡略化されたバージョンです。

cvInitUndistortMap( intrinsic, distort, map1, map2 )

次と同等です。

cvInitUndistortRectifyMap( intrinsic, distort, Identity matrix, intrinsic, 
                           map1, map2 )

新しいパラメータはRnewCameraMatrixです。R実行する追加の変換(回転など)を指定します(単位行列に設定するだけです)。

関心のあるパラメーターは ですnewCameraMatrix。これInitUndistortMapは元のカメラ マトリックスと同じですが、それを使用して、話しているスケーリング効果を得ることができます。

で新しいカメラ マトリックスを取得しGetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...)ます。基本的にintrinsicdistort、元の画像サイズ、およびパラメーターを入力しますalpha(結果のマトリックスを保持するコンテナーと共に、ドキュメントを参照してください)。パラメータalphaはあなたが望むものを達成します。

ドキュメントから引用します:

この関数は、フリー スケーリング パラメーターに基づいて最適な新しいカメラ マトリックスを計算します。このパラメーターを変更することで、ユーザーは 適切なピクセル alpha=0 のみを取得したり、コーナーに貴重な情報がある場合はすべての元の画像ピクセルを保持したり alpha=1を取得したり、その間に何かを取得したりできます。alpha>0 の場合、歪み補正の結果には、キャプチャされた歪み画像の外側の「仮想」ピクセルに対応する黒いピクセルが含まれる可能性があります。元のカメラ マトリックス、歪み係数、計算された新しいカメラ マトリックス、および newImageSize を InitUndistortRectifyMap に渡して、再マップ用のマップを生成する必要があります。

したがって、極端な例では、すべての黒いビットがあなたが望むことを示していますalpha=1

要約すれば:

  • で呼び出しcvGetOptimalNewCameraMatrixalpha=1取得しnewCameraMatrixます。
  • 単位行列で使用cvInitUndistortRectifymapし、計算したばかりのものに設定しますRnewCameraMatrix
  • 新しいマップを にフィードしますcvRemap
于 2012-01-13T01:06:10.210 に答える