Skip to content

Commit 6a9e93d

Browse files
committed
Progressively resize image when running sub-pixel correction
1 parent 33c373a commit 6a9e93d

1 file changed

Lines changed: 21 additions & 3 deletions

File tree

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

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public static Optional<CameraCalibrationValue> findCameraCalibrationResult(
8484
new TermCriteria(TermCriteria.MAX_ITER + TermCriteria.EPS, 30, 0.00001)
8585
);
8686

87+
Logger.info("calibrateCameraRmsError: " + calibrateCameraRmsError);
8788
final DoubleIndexer cameraMatrixIndexer = cameraMatrix.createIndexer();
8889
final StringBuilder cameraStringBuilder = new StringBuilder();
8990
cameraStringBuilder.append("cameraMatrix = {\n");
@@ -176,6 +177,7 @@ private static Size evaluateChessboardImages(
176177
final Size zeroZone = new Size(-1, -1);
177178
final int maxIter = 30;
178179
final double epsilon = 0.00001;
180+
final double resizeDelta = 1.05;
179181
final TermCriteria termCriteria = new TermCriteria(
180182
opencv_core.CV_TERMCRIT_ITER | opencv_core.CV_TERMCRIT_EPS, maxIter, epsilon);
181183

@@ -193,12 +195,28 @@ private static Size evaluateChessboardImages(
193195

194196
if (opencv_calib3d.findChessboardCorners(resizeimage, boardSize, imageCorners)) {
195197
Logger.info("Valid Calibration Image: " + fileName);
198+
196199
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+
for (double sample = downSample / resizeDelta; sample > 1; sample /= resizeDelta) {
201+
final Mat sampleImage = new Mat();
202+
final Size sampleSize = new Size(
203+
(int) (origSize.width() / sample),
204+
(int) (origSize.height() / sample));
205+
opencv_imgproc.resize(image, sampleImage, sampleSize);
206+
for (int i = 0; i < imageCorners.size(0); i++) {
207+
imageCornersIndex.put(i, 0, 0, imageCornersIndex.get(i, 0, 0) * (float) (downSample / sample));
208+
imageCornersIndex.put(i, 0, 1, imageCornersIndex.get(i, 0, 1) * (float) (downSample / sample));
209+
}
210+
opencv_imgproc.cornerSubPix(sampleImage, imageCorners, winSize, zeroZone, termCriteria);
211+
for (int i = 0; i < imageCorners.size(0); i++) {
212+
imageCornersIndex.put(i, 0, 0, imageCornersIndex.get(i, 0, 0) / (float) (downSample / sample));
213+
imageCornersIndex.put(i, 0, 1, imageCornersIndex.get(i, 0, 1) / (float) (downSample / sample));
200214
}
201215
}
216+
for (int i = 0; i < imageCorners.size(0); i++) {
217+
imageCornersIndex.put(i, 0, 0, imageCornersIndex.get(i, 0, 0) * (float) downSample);
218+
imageCornersIndex.put(i, 0, 1, imageCornersIndex.get(i, 0, 1) * (float) downSample);
219+
}
202220
opencv_imgproc.cornerSubPix(image, imageCorners, winSize, zeroZone, termCriteria);
203221
imageCornerMats.add(imageCorners);
204222
validNames.add(fileName);

0 commit comments

Comments
 (0)