2012-12-13 10 views
6

私は現在、一対のステレオカメラ用のopenCVプログラムを作成しています。 カメラのキャリブレーションとステレオキャリブレーションが行われます。InitUndistortRectifyMapとRemap

次のステップは、私が得る2つの画像から空間内の地物の位置を見つけることです。だからこそ私はステレオ画像を整理してから計算しなければならないのです。

私はinitUndistortRectifyMapに直面しています問題は以下の通りです:

私はリマップ後に黒画像を取得stereoRectify()initUndistortRectifyMap()にして算出R1やR2を渡す-if。

- 私がinitUndistortRectifyMap()にr(空の行列)を渡すと、再マッピング後に未補正の画像が得られます。私が得た画像は少し歪んでいます。

2台のカメラを整流するために、R1とR2をinitUndistortRectifyMap()に渡す必要があります。そうしないと、空の行列を渡すとステレオヘッドが同じ平面に回転しません。

stereoRectify(intrinsic[0], distCoeffs[0], intrinsic[1], distCoeffs[1], imageSize, 
    R, T_Stereo, R1, R2, newP1, newP2, Q, CV_CALIB_ZERO_DISPARITY, -1, imageSize); 

if (x_Cam.GetSerial()=="4002678487") 
{ 
    initUndistortRectifyMap(intrinsic[0], distCoeffs[0], R1, newP1, imageSize,   
     CV_16SC2 , mapx1, mapy1); 
    remap(x_Image, imageRectified[0],mapx1, mapy1, INTER_LINEAR); 

    return imageRectified[0]; 
} 

if (x_Cam.GetSerial()=="4002702131") 
{ 
    //flip(in, in, -1); 
    initUndistortRectifyMap(intrinsic[1], distCoeffs[1], R2, newP2, imageSize, 
     CV_16SC2 , mapx2, mapy2); 
    remap(x_Image, imageRectified[1],mapx2, mapy2, INTER_LINEAR, BORDER_CONSTANT, 0); 

    return imageRectified[1]; 
} 

私はstereoRectify()に行くすべてのマトリックス値をチェックし、それらが正しい:後

は私のコードです。回転行列R1、R2も同様に正しいと思われる。私はちょうど出力として黒いイメージを得ています。

R1とR2(例:R1 * R2)のゴミ値をに渡してみましたが、単純に効果を見ると、奇妙な結果が得られましたが、黒い画像は表示されませんでした。

+2

「initUndistortRectifyMap()はなぜ奇妙な結果ではなく黒い画像を返すのですか?次回は、具体的な質問を明示的にしてみてください。 –

+0

'initUndistortRectifyMap()'を使う前にカメラを較正する必要があります。まだそれをやっていないようです。カメラを校正するコードを投稿してください:http://www.aishack.in/2010/07/calibrating-undistorting-with-opencv-in-c-oh-yeah/ –

+0

1台のカメラは両方とも校正されていますカメラをStereoCalibrate()と一緒に使用します。私はStereoCalibratoinからRとTの行列をチェックしており、それらは正しいです。 – user1901213

答えて

7

まあ、私は問題を回避し、誰もが使用できるソリューションを共有すると思っていました。

InitUndistortRectifyMapは、StereoRectifyで生成された回転行列R1とR2を使用すると、空白の画像を出力しました。

R1 = INV(CamMatrix1)* H1 * CamMatrix1 R2 =

従って、I 2ホモグラフィは、H1、およびH2、およびOpenCVのマニュアルに従って回転を計算I行列を生成StereoRectifyUncalibratedを使用しようとしましたinv(CamMatrix2)* H2 * CamMatrix2

私は新しいR1とR2をInitUndistortRectifyMapに渡して再マッピングし、結果は満足です。

2

私はこの問題についての研究に最近取り組んできたので、この古い記事を掘り下げます。すなわち、私は同じ問題に直面しました。適切なステレオキャリブレーションと整流(すべてのステレオビジョン機材をopencvで提供しています)、最終的に 'ワープされた'画像は黒です。私はなぜそうそれを説明しましょう。

まず、リマップ(src、dst、mapX、mapY)がどのように動作するのですか?あなたがdocumentationに行けば、あなたは

enter image description here

と値mapX(x、y)のかmapY(x、y)は、srcの外にある、DST(x、y)は=の1つがあることを確認することができます0(黒!)。つまり、すべてのペア(x​​、y)はmapXまたはmapYに無効な値を持ちます。たとえば、私の場合、理由から私はmapYのすべての値が負であると説明することはできません。

しかし、これは、特定のステレオビジョン構成でのみ発生します。私は、それらの間の回転角が小さい(数度まで)ように整列されたカメラでいくつかの例を作った。その場合、opencvプロシージャはうまくいきます。 2つのオイラー角が同じで、1つの角度(Y周りの回転)が17度だったときに私が持っていた「黒い」出力の問題。その場合、私はいくつかの実験をした - 私は、次のようにmapXとmapYを翻訳:

for(int i=0;i<_imageSize.width;i++) 
     for(int j=0;j<_imageSize.height;j++) { 
      _mapXA.at<float>(j, i) -= 1200; 
      _mapYA.at<float>(j, i) -= 1200; 
      _mapXB.at<float>(j, i) += 2500; 
      _mapYB.at<float>(j, i) += 2500; 
     } 

を(私は_mapXAが大きすぎた見て_mapYBが-1500の周りに負の値を持っていたbeacuse)。驚くべきことに、remap()の後の出力は黒ではありませんでした。画像はちょうどある角度(私は正確にチェックしなかったかもしれない17かもしれない)のまわりで回転したようにまったく同じように見えたが、まったく修正されなかった。

opencvがステレオビジョンで非平行カメラをうまく処理できない可能性があります。つまり、いくつかの例では動作しますが、いくつかの例では動作しませんが、この方法は実現不可能です。

はもう一度、これはあなたがのようにほぼ正面平行となるように、あなたの のカメラを配置した場合、より良い結果を得るために傾向が理由の一つです。また、あなたはそのような情報ゲイリー・ブラッドスキーとエイドリアン・カラー学習OpenCVのを見つけることができます可能であれば(少なくとも ステレオビジョンでエキスパートになるまで)

関連する問題