19

2k x 1.5k のような 15 メガ ピクセル未満の画像には、FindChessboardCorners 関数を使用できます。しかし、3700x5300 の解像度の DSLR からの画像で使用すると、機能しません。

resize() を使用して画像サイズを直接縮小しようとしましたが、うまくいきました。

明らかに、OpenCV ソース コードにはハード コードされたものやバグがあります。

それを理解するのを手伝ってくれますか、またはこれに対するパッチを教えてくれますか?

誰かが 2006 年に同様の問題を投稿しているのを見つけたので、問題はまだ残っているようです。

私が使用したコードは次のようなものです

found = findChessboardCorners( viewGray, boardSize, ptvec,
                                CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);

アップデート

ここで明確にするだけです。アルゴリズムは大きな画像解像度で機能すると思いますが、チェス盤が画像の大部分を占めると失敗します。たとえば、同じカメラ位置で 50 mm の固定レンズを使用すると、FindChessboardCorners が失敗することはありません。100mm 固定レンズに変更した後、機能が開始され、パターンの検出が停止します。プロポーションや焦点距離に関係していると思います。

下の画像は100mmレンズの結果です。

更新 2

大きな画像にシャープフィルターを追加したところ、問題が修正され始めました。

最初に私が使用した

//do a sharpen filter for the large resolution image
if (viewGray.cols > 1500)
{
  Mat temp ;
  GaussianBlur(viewGray,temp, Size(0,0), 105) ; //hardcoded filter size, to be tested on 50 mm lens
  addWeighted(viewGray, 1.8, temp, -0.8,0,viewGray) ; //hardcoded weight, to be tested.
//imwrite("test"+ imageList[k][i], viewGray) ;

}

found = findChessboardCorners( viewGray, boardSize, ptvec,
CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FILTER_QUADS + CV_CALIB_CB_NORMALIZE_IMAGE + CV_CALIB_CB_FAST_CHECK);

画像をアップロードしました:

元の解像度 3744 x 5616 の jpg 画像。このサイトで変換を強制する場合は、正しい解像度で使用していることを確認してください。

元の解像度 3744 x 5616 の jpg 画像。このサイトで変換を強制する場合は、正しい解像度で使用していることを確認してください。

4

2 に答える 2

32

いくつかのポイント。

  1. お気づきのように、小型化は検出器に役立ちます。これは、角を検出するために OpenCV で使用される角検出フィルターのサイズが固定されており、畳み込みマスクのサイズが小さすぎて角を検出できない可能性があるためです。少しぼやけているところ。ただし、縮小すると、コーナーの位置精度がいくらか失われます。
  2. 同じ理由で、研ぎも役立ちます。ただし、ノイズのない理想的なケースであっても、コーナーのサブピクセル位置にバイアスがかかるため、精度にも反します。これが事実であることを自分自身に納得させるために、1D アナログを考えてみましょう: 角の周りの画像の強度 (1D では、シャープな白黒遷移) は、理想的にはシグモイド曲線 (角が滑らかなランプ) のように見えます。その変曲点の位置を見つけるために。シャープにすることで曲線が急勾配になり、一般にそのポイントの位置が移動します。シャープニングは一般にノイズを増幅することを考慮すると、事態はさらに悪化します。
  3. 続行する正しい方法は、より低い解像度 (つまり、ダウンサイジング) で開始し、見つかったコーナーの位置を拡大して、フル解像度で cvFindCornersSubpix を実行するための初期推定値として使用することです。
于 2013-02-25T19:22:59.867 に答える
1

OpenCV ソースにアクセスして再構築できる場合は、cvFindChessboardCorners.

そう#define DEBUG_CHESSBOARDすれば、アルゴリズムを理解するのに役立つでしょう。

OpenCV 2.4 にはこの機能があると思います (たとえば、https://github.com/Itseez/opencv/blob/2.4/modules/calib3d/src/calibinit.cppを参照)。

さらに、あなたのケースには当てはまらないように見えても、OpenCV doc はキャリブレーションターゲットの要件を示しています:

: この関数では、さまざまな環境で検出をより堅牢にするために、ボードの周囲に空白 (正方形の太い境界線のように、広いほど良い) が必要です。それ以外の場合、境界線がなく背景が暗い場合、外側の黒い四角形を適切にセグメント化できないため、四角形のグループ化と順序付けのアルゴリズムは失敗します。

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners

問題のチェス盤には、行 (6 つの角) と列 (8 つの角) の両方に偶数の内側の角がありますが、参照 OpenCV チェス盤 ここに画像の説明を入力には偶数/奇数の角があります。つまり、9x6 です。問題になる可能性があります。

于 2013-11-21T20:54:56.190 に答える