packages feed

CV-0.3.5: examples/Fitting.hs

module Main where
import CV.Fitting
import CV.Image
import CV.ConnectedComponents
import CV.Drawing
import CV.Matrix
import CV.ImageOp
import CV.Bindings.Types
import System.Environment

main' = do
        let res :: Image RGB D32
            res = empty (400,400)
            testPts = [(200+100*sin x-80*cos x,200+60*cos x) | x <- [0,0.1..pi]] ++
                      [(150+100*sin (-x)+20*cos x,100+60*cos (-x)) | x <- [0,0.1..2*pi]]
            mat = fromList (1,length testPts) testPts
            ell = fitEllipse mat
            bb  = minAreaRect mat
            br  = boundingRect mat
            ch  = map (both round) . toList $ convexHull mat 
            segments = zip (ch) (tail . cycle $ ch)
            pts = res <## [circleOp (0.5,0.5,0.5) (round x, round y) 3 Filled | (x,y) <- testPts]
                      <#  drawLinesOp (1,0,0) 1 segments
                      <# drawBox2Dop (0,1,0) bb
        saveImage "bb_result.png" pts
        print ell
        print bb
        print br

main = do
    Just x <- getArgs >>= loadImage . head
    let 
        cs = head . mapContours contourPoints . getContours . unsafeImageTo8Bit $ x 
        mat :: Matrix (Float,Float)
        mat = fromList (1,length cs) (map (both realToFrac) cs)
        matI :: Matrix (Int,Int)
        matI = fromList (1,length cs) (map (both round) cs)
        ell = fitEllipse mat
        bb  = minAreaRect mat
        br  = boundingRect mat
        ch  = map (both round) . toList $ convexHull mat 
        cdefs = convexityDefects matI
        segments = zip (ch) (tail . cycle $ ch)
        pts = grayToRGB x 
                  <## [circleOp (0.5,0.5,0.5) (round x, round y) 3 Filled | (x,y) <- toList mat]
                  <## [circleOp (1,0,0.8) (fromIntegral x, fromIntegral y) 13 Filled 
                      | (_,_,C'CvPoint x y,_) <- cdefs]
                  <#  drawLinesOp (1,0,0) 3 segments
                  <#  drawBox2Dop (0,1,0) bb
    mapM_ print cdefs
    saveImage "bb_result.png" pts


both f (a,b)  = (f a, f b)