1111import org .bytedeco .javacpp .opencv_core .Size ;
1212import org .bytedeco .javacpp .opencv_core .TermCriteria ;
1313import org .bytedeco .javacpp .opencv_imgcodecs ;
14+ import org .bytedeco .javacpp .opencv_imgproc ;
1415import org .pmw .tinylog .Logger ;
1516
1617import java .io .File ;
@@ -40,7 +41,8 @@ private ChessboardCalibration() {
4041 public static Optional <CameraCalibrationValue > findCameraCalibrationResult (
4142 final String folder ,
4243 final int boardWidth ,
43- final int boardHeight
44+ final int boardHeight ,
45+ final double downSample
4446 ) {
4547 final List <String > fileNames = getFolderFileNames (folder );
4648 final List <String > validNames = new ArrayList <>();
@@ -51,7 +53,7 @@ public static Optional<CameraCalibrationValue> findCameraCalibrationResult(
5153 final Mat distortionCoeffs = new Mat ();
5254
5355 final Size imageSize = evaluateChessboardImages (
54- fileNames , validNames , boardSize , objectCornerMatsVect , imageCornerMatsVect );
56+ fileNames , validNames , boardSize , downSample , objectCornerMatsVect , imageCornerMatsVect );
5557
5658 if (imageSize == null ) {
5759 return Optional .empty ();
@@ -158,6 +160,7 @@ private static Size evaluateChessboardImages(
158160 final List <String > fileNames ,
159161 final List <String > validNames ,
160162 final Size boardSize ,
163+ final double downSample ,
161164 final MatVector objectCornerMatsVect ,
162165 final MatVector imageCornerMatsVect
163166 ) {
@@ -168,11 +171,35 @@ private static Size evaluateChessboardImages(
168171 final List <Mat > imageCornerMats = new ArrayList <>();
169172 Size imageSize = null ;
170173
174+ final int winSizeLength = 5 ;
175+ final Size winSize = new Size (winSizeLength , winSizeLength );
176+ final Size zeroZone = new Size (-1 , -1 );
177+ final int maxIter = 30 ;
178+ final double epsilon = 0.00001 ;
179+ final TermCriteria termCriteria = new TermCriteria (
180+ opencv_core .CV_TERMCRIT_ITER | opencv_core .CV_TERMCRIT_EPS , maxIter , epsilon );
181+
171182 for (final String fileName : fileNames ) {
172183 final Mat image = opencv_imgcodecs .imread (fileName , opencv_imgcodecs .IMREAD_GRAYSCALE );
173184 final Mat imageCorners = new Mat ();
174185
175- if (opencv_calib3d .findChessboardCorners (image , boardSize , imageCorners )) {
186+ final Size origSize = image .size ();
187+
188+ final Mat resizeimage = new Mat ();
189+ final Size downSize = new Size (
190+ (int ) (origSize .width () / downSample ),
191+ (int ) (origSize .height () / downSample ));
192+ opencv_imgproc .resize (image , resizeimage , downSize );
193+
194+ if (opencv_calib3d .findChessboardCorners (resizeimage , boardSize , imageCorners )) {
195+ Logger .info ("Valid Calibration Image: " + fileName );
196+ final FloatIndexer imageCornersIndex = imageCorners .createIndexer ();
197+ for (int i = 0 ; i < imageCorners .size (0 ); i ++) {
198+ for (int j = 0 ; j < imageCorners .size (1 ); j ++) {
199+ imageCornersIndex .put (i , j , imageCornersIndex .get (i , j ) * (float ) downSample );
200+ }
201+ }
202+ opencv_imgproc .cornerSubPix (image , imageCorners , winSize , zeroZone , termCriteria );
176203 imageCornerMats .add (imageCorners );
177204 validNames .add (fileName );
178205 // Create imageSize on first valid image
@@ -182,6 +209,8 @@ private static Size evaluateChessboardImages(
182209 Logger .info ("All images must have the same size!" );
183210 return null ;
184211 }
212+ } else {
213+ Logger .info ("Invalid Calibration Image: " + fileName );
185214 }
186215 }
187216
0 commit comments