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 画像。このサイトで変換を強制する場合は、正しい解像度で使用していることを確認してください。