Skip to content

Commit 33c373a

Browse files
committed
Downsample image before running through chessboard calibration
1 parent 9c207b6 commit 33c373a

2 files changed

Lines changed: 34 additions & 5 deletions

File tree

src/main/java/com/easternedgerobotics/rov/video/CameraCalibration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ public CameraCalibration(
6363
public void calibrate() {
6464
final Scheduler.Worker worker = scheduler.createWorker();
6565
worker.schedule(() -> ChessboardCalibration.findCameraCalibrationResult(
66-
config.cameraAImagesDirectory(), config.chessboardWidth(), config.chessboardHeight()
66+
config.cameraAImagesDirectory(), config.chessboardWidth(), config.chessboardHeight(), config.downSample()
6767
).ifPresent(value -> store.set(config.cameraAName(), value)));
6868
worker.schedule(() -> ChessboardCalibration.findCameraCalibrationResult(
69-
config.cameraBImagesDirectory(), config.chessboardWidth(), config.chessboardHeight()
69+
config.cameraBImagesDirectory(), config.chessboardWidth(), config.chessboardHeight(), config.downSample()
7070
).ifPresent(value -> store.set(config.cameraBName(), value)));
7171
}
7272

src/main/java/com/easternedgerobotics/rov/video/ChessboardCalibration.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.bytedeco.javacpp.opencv_core.Size;
1212
import org.bytedeco.javacpp.opencv_core.TermCriteria;
1313
import org.bytedeco.javacpp.opencv_imgcodecs;
14+
import org.bytedeco.javacpp.opencv_imgproc;
1415
import org.pmw.tinylog.Logger;
1516

1617
import 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

Comments
 (0)