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)