2

私はOpenCVでC++コードを書いています。ここでは、画像(.jpgファイルからロードされた)上のチェス盤を検出して、画像の遠近法を歪めようとしています。findChessboardCorners()によってチェス盤が見つかると、残りのコードは完全に機能します。ただし、関数がパターンを検出しない場合があり、この動作はランダムに見えます。

たとえば、元の解像度2560x1920で機能する画像が1つありますが、最初にGIMPで800x600に縮小した場合は機能しません。ただし、別の画像は逆のように見えます。元の解像度では機能しませんが、縮小されて機能します。

検出を行う私のコードの一部は次のとおりです。

Mat grayimg = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
if (img.data == NULL) {
    printf("Unable to read image");
    return 0;
}
bool patternfound = findChessboardCorners(grayimg, patternsize, corners,
        CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_FAST_CHECK);
if (!patternfound) {
    printf("Chessboard not found");
    return 0;
}

この動作を引き起こすopencvに何らかのバグがありますか?関数がより一貫して機能するように、画像を前処理する方法について誰かがヒントを持っていますか?

パラメータCALIB_CB_ADAPTIVE_THRESH、CALIB_CB_NORMALIZE_IMAGE、CALIB_CB_FILTER_QUADS、およびCALIB_CB_FAST_CHECKを試してみました。カラー画像を渡すときにも同じ結果が得られます。

前もって感謝します

編集:私はOpenCVバージョン2.4.1を使用しています

4

4 に答える 4

2

チェス盤の周りにホワイト ボーダーを追加するまで、findChessboardCorners を機能させるのに非常に苦労しました。

最近のドキュメントのどこかでヒントとしてそれを見つけました。

ボーダーを追加する前は、キーボードを認識できない場合がありましたが、白いボーダーを使用すると、常に機能します。

于 2012-07-18T18:08:40.927 に答える
1

実際には、CALIB_CB_FAST_CHECKオプションを削除して、試してみてください。

于 2012-08-13T01:22:54.110 に答える
1

現実世界のコンピューター ビジョンの楽しさへようこそ :-)

画像を投稿しておらず、findChessboardCorners は高レベルすぎてデバッグできません。十分に検出されているかどうかを確認するために、検出されたコーナーの位置を画像の上に (オクターブ、matlab、またはその他の OpenCV コードで) 表示することをお勧めします。何もない場合は、画像に対して cvCornerHarris を単独で実行してみてください。

問題の原因は、画像の過度の粒状性である場合があります。ぼかしを少し試してみて、それが役立つかどうかを確認してください。

于 2012-06-22T12:19:57.233 に答える