/
Operations.hs
95 lines (85 loc) · 2.44 KB
/
Operations.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{-# LANGUAGE ScopedTypeVariables #-}
module CV.Operations
( clear
, set
, NormType(..)
, normalize
, unitNormalize
, unitStretch
, logNormalize
, cartToPolar
) where
import CV.Bindings.Core
import CV.Bindings.Types
import CV.Image
import CV.ImageMath as IM
import CV.ImageMathOp
import Foreign.Marshal.Utils (with)
import Foreign.Ptr (nullPtr,castPtr)
import System.IO.Unsafe
clear :: Image c d -> Image c d
clear i = unsafePerformIO $ do
withImage i $ \i_ptr ->
c'cvSetZero (castPtr i_ptr)
return i
set :: Double -> Image c d -> Image c d
set v i = unsafePerformIO $ do
withImage i $ \i_ptr ->
c'wrapSetAll (castPtr i_ptr) (realToFrac v) nullPtr
return i
data NormType =
NormC |
NormL1 |
NormL2 |
NormMask |
NormRelative |
NormDiff |
NormMinMax |
NormDiffC |
NormDiffL1 |
NormDiffL2 |
NormDiffRelativeC |
NormDiffRelativeL1 |
NormDiffRelativeL2
cNormType t =
case t of
NormC -> c'CV_C
NormL1 -> c'CV_L1
NormL2 -> c'CV_L2
NormMask -> c'CV_NORM_MASK
NormRelative -> c'CV_RELATIVE
NormDiff -> c'CV_DIFF
NormMinMax -> c'CV_MINMAX
NormDiffC -> c'CV_DIFF_C
NormDiffL1 -> c'CV_DIFF_L1
NormDiffL2 -> c'CV_DIFF_L2
NormDiffRelativeC -> c'CV_RELATIVE_C
NormDiffRelativeL1 -> c'CV_RELATIVE_L1
NormDiffRelativeL2 -> c'CV_RELATIVE_L2
normalize :: Double -> Double -> NormType -> Image c d -> Image c d
normalize a b t src =
unsafePerformIO $ do
withCloneValue src $ \clone ->
withGenImage src $ \si ->
withGenImage clone $ \ci -> do
c'cvNormalize si ci (realToFrac a) (realToFrac b) (cNormType t) nullPtr
return clone
unitNormalize i
| minval >= 0 && minval <= 1 && maxval >= 0 && maxval <= 1 = i
| otherwise = normalize 0 1 NormMinMax i
where
m@(minval, maxval) = IM.imageMinMax i
unitStretch i = normalize 0 1 NormMinMax i
logNormalize = unitNormalize . IM.log . (1 |+)
cartToPolar :: (Image GrayScale D32, Image GrayScale D32) -> (Image GrayScale D32, Image GrayScale D32)
cartToPolar (x,y) = unsafePerformIO $ do
r::(Image GrayScale D32) <- create (w, h)
a::(Image GrayScale D32) <- create (w, h)
withImage x $ \px ->
withImage y $ \py ->
withImage r $ \pr ->
withImage a $ \pa -> do
c'cvCartToPolar (castPtr px) (castPtr py) (castPtr pr) (castPtr pa) (fromIntegral 0)
return (r,a)
where
(w,h) = getSize x