は優れたライブラリですが、ドキュメントがたくさんあるので理解しづらいので、使用するのが難しい場合もありますし、多くの例はありません。
すべてのぼかし関数には(M.Mat shape ('S channels) ('S depth))
の行列が必要ですが、通常は次のようになります。(M.Mat shape channels depth)
ここで、'S
は静的であることを示します。
私はこの機能を使用します。このようなマトリックスを持つように
M.coerceMat
を。
coerceMAt :: (ToShapeDS (Proxy shapeOut), ToChannelsDS (Proxy
channelsOut), ToDepthDS (Proxy depthOut))
=> Mat shapeIn channelsIn depthIn
-> CvExcept (Mat shapeOut channelsOut depthOut)
それはCVExcept
を返すように、私はただの画像を取得するためにexceptError :: CvExcept a -> a
を使用しています。
しかし、最も重要なのは機能の定義です。私のコードに問題がありました。ここで
forall height0 width0 channels depth . (depth `In` '[Word8, Word16, Float, Double] , channels `In` '[1, 3, 4]) => M.Mat ('S '[height0, width0]) ('S channels) ('S depth) -> IO (M.Mat ('S '[height0, width0]) ('S channels) ('S depth))
は完全な例です: depth
は、私が書いた理由です、曖昧にすることはできません。私は画像を取得し、サイズを変更し、ぼかして表示します。
メイン:
module Main where
import Lib
import qualified OpenCV.Internal.Core.Types.Mat as M
import Control.Monad (void)
import qualified OpenCV as CV
import qualified Data.ByteString as B
main :: IO()
main = do
test <- controller
CV.withWindow "test" $ \window -> do
CV.imshow window test
void $ CV.waitKey 10000
のLib:
{-# LANGUAGE TypeFamilies #-}
module Lib
(controller
) where
import BlurImage
import ResizeImage
import Utils
import Control.Monad (void)
import Data.Word
import qualified OpenCV.Internal.Core.Types.Mat as M
import qualified OpenCV as CV
import qualified Data.ByteString as B
controller :: IO (CV.Mat (CV.S '[CV.D, CV.D]) (CV.S 1) (CV.S Word8))
controller = do
file <- B.readFile "path/to/image.jpg"
img <- return $ CV.imdecode CV.ImreadGrayscale file
resized_little_img <- resizeImage img --little image for making a blur in and find the receipt
blurImage ((CV.exceptError $ M.coerceMat resized_little_img) :: M.Mat (CV.S '[ CV.D, CV.D]) (CV.S 1) (CV.S Word8))
ResizeImage:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module ResizeImage
(
resizeImage
) where
import Utils
import Control.Monad (void)
import Control.Monad.Except
import Data.Functor.Identity
import Data.Word
import Data.Proxy
import qualified OpenCV as CV
import Linear.V2
import OpenCV.TypeLevel
import qualified OpenCV.Internal.Core.Types.Mat as M
import qualified OpenCV.Core.Types.Size as S
import qualified OpenCV.ImgProc.GeometricImgTransform as GIT
import GHC.Int (Int32)
resizingImage :: (M.Mat (CV.S [CV.D, CV.D]) CV.D CV.D) -> CV.CvExcept (M.Mat (CV.S [CV.D, CV.D]) CV.D CV.D)
resizingImage image = GIT.resize (GIT.ResizeAbs $ S.toSize $ (getSize w h Nothing (Just 500))) CV.InterCubic image
where
[h, w] = getHandW image
resizeImage :: (M.Mat (S '[CV.D, CV.D]) CV.D CV.D) -> IO(M.Mat (CV.S [CV.D, CV.D]) CV.D CV.D)
resizeImage image = do
resized <- return $ resizingImage image
return $ CV.exceptError $ resized
BlurImage:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module BlurImage
(
blurImage
) where
import Utils
import Control.Monad (void)
import Control.Monad.Except
import qualified Data.ByteString as B
import Data.Word
import Data.Proxy
import qualified OpenCV as CV
import Linear.V2
import OpenCV.TypeLevel
import qualified OpenCV.Internal.Core.Types.Mat as M
import qualified OpenCV.Core.Types.Size as S
import qualified OpenCV.ImgProc.GeometricImgTransform as GIT
import GHC.Int (Int32)
medianBlurImage :: (depth `In` '[Word8, Word16, Float], channels `In` '[1, 3, 4]) => (M.Mat shape ('S channels) ('S depth)) -> CV.CvExcept (M.Mat shape ('S channels) ('S depth))
medianBlurImage image = CV.medianBlur image 13
gaussianBlurImage :: (depth `In` '[Word8, Word16, Float, Double], channels `In` '[1, 3, 4]) => (M.Mat shape ('S channels) ('S depth)) -> CV.CvExcept (M.Mat shape ('S channels) ('S depth))
gaussianBlurImage image = CV.gaussianBlur (V2 13 13 :: V2 Int32) 0 0 image
blurImage :: forall height0 width0 channels depth . (depth `In` '[Word8, Word16, Float, Double] , channels `In` '[1, 3, 4]) => M.Mat ('S '[height0, width0]) ('S channels) ('S depth) -> IO (M.Mat ('S '[height0, width0]) ('S channels) ('S depth))
blurImage image = do
gaussianBlurred <- return $ gaussianBlurImage image
return $ CV.exceptError $ gaussianBlurred
それだけです。 :)私はそれが誰かを助けることを願っています
あなたは、完全な例を最低限提供できますか?あなたが提供した断片は、誰かがファイルに貼り付けて自分自身をコンパイルしようとするものではありません。 –
ここに要点があります:[要点](https://gist.github.com/Chuck-Aguilar/2a4a0506c2924c4d72134a45dc19935c) 問題は「深さ」のタイプであることがわかりました。 '[Word8、Word16、Float]、チャンネル 'In' [1,3、4])=>'しかし、それでも動作しません。私はこのエラーが発生します: 'タイプ 'IO'と 'CV.CvExceptionがどちらかと一致しませんでした'予想されるタイプ:どちらかCV.CvException()実際のタイプ:IO()'それは異常です。画像。 –