The following example performs connected component analysis.
(use-modules (aiscm core) (aiscm opencv) (aiscm magick))
(define result (connected-components (gt (green (read-image "letters.png")) 0) 8))
(define count (cdr result))
(define components (car result))
(define r (to-array (map (lambda _ (random 192)) (iota count))))
(define g (to-array (map (lambda _ (random 192)) (iota count))))
(define b (to-array (map (lambda _ (random 192)) (iota count))))
(define colors (+ (rgb r g b) 64))
(set colors 0 (rgb 0 0 0))
(write-image (warp colors components) "components.png")
The example below shows how to use OpenCV to detect a Charuco board.
(use-modules (oop goops) (aiscm opencv) (aiscm image) (aiscm v4l2) (aiscm xorg) (aiscm core))
(define v (make <v4l2>))
(show
(lambda _
(let* [(img (from-image (read-image v)))
(markers (detect-markers img DICT_4X4_50))]
(if (zero? (size-of (car markers)))
img
(let [(corners (interpolate-corners markers img 5 7 100 50))]
(draw-corners img corners))))))
A Charuco board image can be generated as follows.
(use-modules (aiscm opencv) (aiscm magick) (aiscm core))
(write-image (charuco-board 5 7 100 50 DICT_4X4_50) "board.png")
A printed Charuco board can be used to calibrate a camera as shown below.
(use-modules (oop goops) (aiscm core) (aiscm image) (aiscm v4l2) (aiscm xorg) (aiscm opencv))
(define v (make <v4l2>))
(define object-points '())
(define image-points '())
(show
(lambda _
(let* [(img (from-image (read-image v)))
(markers (detect-markers img DICT_4X4_50))]
(if (zero? (size-of (car markers)))
img
(let* [(corners (interpolate-corners markers img 5 7 100 50))
(object (grid (1- 7) 0.02 (car corners)))
(image (cdr corners))]
(if (>= (car (shape (car corners))) 5)
(begin
(set! object-points (cons object object-points))
(set! image-points (cons image image-points))))
(draw-corners img corners))))))
(define cal (camera-calibration object-points image-points (shape v)))
(format #t "reprojection error = ~a~&" (car cal))
(write-camera-calibration "camera.yml" (cadr cal) (caddr cal))