{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} module OpenCV.ImgProc.ColorMaps ( ColorMap(..) , applyColorMap ) where import "base" Data.Int import "base" Data.Word import qualified "inline-c" Language.C.Inline as C import qualified "inline-c-cpp" Language.C.Inline.Cpp as C import "this" OpenCV.Core.Types import "this" OpenCV.Internal.C.Inline ( openCvCtx ) import "this" OpenCV.Internal.C.Types import "this" OpenCV.Internal.Core.Types.Mat import "this" OpenCV.Internal.Exception import "this" OpenCV.TypeLevel -------------------------------------------------------------------------------- C.context openCvCtx C.include "opencv2/core.hpp" C.include "opencv2/imgproc.hpp" C.using "namespace cv" #include #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "namespace.hpp" -------------------------------------------------------------------------------- data ColorMap = ColorMapAutumn -- ^ <> | ColorMapBone -- ^ <> | ColorMapJet -- ^ <> | ColorMapWinter -- ^ <> | ColorMapRainbow -- ^ <> | ColorMapOcean -- ^ <> | ColorMapSummer -- ^ <> | ColorMapSpring -- ^ <> | ColorMapCool -- ^ <> | ColorMapHsv -- ^ <> | ColorMapPink -- ^ <> | ColorMapHot -- ^ <> | ColorMapParula -- ^ <> #num COLORMAP_AUTUMN #num COLORMAP_BONE #num COLORMAP_JET #num COLORMAP_WINTER #num COLORMAP_RAINBOW #num COLORMAP_OCEAN #num COLORMAP_SUMMER #num COLORMAP_SPRING #num COLORMAP_COOL #num COLORMAP_HSV #num COLORMAP_PINK #num COLORMAP_HOT #num COLORMAP_PARULA marshalColorMap :: ColorMap -> Int32 marshalColorMap = \case ColorMapAutumn -> c'COLORMAP_AUTUMN ColorMapBone -> c'COLORMAP_BONE ColorMapJet -> c'COLORMAP_JET ColorMapWinter -> c'COLORMAP_WINTER ColorMapRainbow -> c'COLORMAP_RAINBOW ColorMapOcean -> c'COLORMAP_OCEAN ColorMapSummer -> c'COLORMAP_SUMMER ColorMapSpring -> c'COLORMAP_SPRING ColorMapCool -> c'COLORMAP_COOL ColorMapHsv -> c'COLORMAP_HSV ColorMapPink -> c'COLORMAP_PINK ColorMapHot -> c'COLORMAP_HOT ColorMapParula -> c'COLORMAP_PARULA {- | Applies a GNU Octave/MATLAB equivalent colormap on a given image The human perception isn’t built for observing fine changes in grayscale images. Human eyes are more sensitive to observing changes between colors, so you often need to recolor your grayscale images to get a clue about them. OpenCV now comes with various colormaps to enhance the visualization in your computer vision application. Example: @ grayscaleImg :: forall (height :: Nat) (width :: Nat) depth . (height ~ 30, width ~ 256, depth ~ Word8) => Mat (ShapeT [height, width]) ('S 1) ('S depth) grayscaleImg = exceptError $ matFromFunc (Proxy :: Proxy [height, width]) (Proxy :: Proxy 1) (Proxy :: Proxy depth) grayscale where grayscale :: [Int] -> Int -> Word8 grayscale [_y, x] 0 = fromIntegral x grayscale _pos _channel = error "impossible" type ColorMapImg = Mat (ShapeT [30, 256]) ('S 3) ('S Word8) mkColorMapImg :: ColorMap -> ColorMapImg mkColorMapImg cmap = exceptError $ applyColorMap cmap grayscaleImg colorMapAutumImg :: ColorMapImg colorMapBoneImg :: ColorMapImg colorMapJetImg :: ColorMapImg colorMapWinterImg :: ColorMapImg colorMapRainbowImg :: ColorMapImg colorMapOceanImg :: ColorMapImg colorMapSummerImg :: ColorMapImg colorMapSpringImg :: ColorMapImg colorMapCoolImg :: ColorMapImg colorMapHsvImg :: ColorMapImg colorMapPinkImg :: ColorMapImg colorMapHotImg :: ColorMapImg colorMapParulaImg :: ColorMapImg colorMapAutumImg = mkColorMapImg ColorMapAutumn colorMapBoneImg = mkColorMapImg ColorMapBone colorMapJetImg = mkColorMapImg ColorMapJet colorMapWinterImg = mkColorMapImg ColorMapWinter colorMapRainbowImg = mkColorMapImg ColorMapRainbow colorMapOceanImg = mkColorMapImg ColorMapOcean colorMapSummerImg = mkColorMapImg ColorMapSummer colorMapSpringImg = mkColorMapImg ColorMapSpring colorMapCoolImg = mkColorMapImg ColorMapCool colorMapHsvImg = mkColorMapImg ColorMapHsv colorMapPinkImg = mkColorMapImg ColorMapPink colorMapHotImg = mkColorMapImg ColorMapHot colorMapParulaImg = mkColorMapImg ColorMapParula @ <> -} applyColorMap :: ColorMap -> Mat shape ('S 1) ('S Word8) -> CvExcept (Mat shape ('S 3) ('S Word8)) applyColorMap colorMap src = unsafeWrapException $ do dst <- newEmptyMat handleCvException (pure $ unsafeCoerceMat dst) $ withPtr src $ \srcPtr -> withPtr dst $ \dstPtr -> [cvExcept| cv::applyColorMap( *$(Mat * srcPtr) , *$(Mat * dstPtr) , $(int32_t c'colorMap) ); |] where c'colorMap = marshalColorMap colorMap