啊!
我正在使用haskell-opencv库。我不知道是否有其他人在使用它,或者对它有所了解。
我试图使用gaussianBlurImage,但有一个错误我无法识别。
我有这个:
cropped image = do
resized <- resizeImage image
gaussianBlurred <- gaussianBlurImage ((M.unsafeCoerceMat . getImageFromEither) resized)其中,调整大小的是一个CV.Exception (M.Mat形状通道深度),我从这里得到一个gaussianBlurImage函数需要的Mat shape (S channels) (S depth)。
我定义了gaussianBlurImage,因此:
gaussianBlurImage image = runExceptT $ CV.pureExcept $ CV.gaussianBlur (V2 13 13 :: V2 Int32) 0 0 image
对我来说,一切都很好。类似于这里:模糊。但我知道这个错误:
无法将预期类型‘’True‘与实际类型’Elem depth0 'Word8、Word16、Float、Double‘相匹配
我注意到,我的gaussianBlurImage有这样的类型:
gaussianBlurImage :: (M.Mat shape0 ('S channels0) ('S depth0)) -> Either CV.CvException (Either CV.CvException (M.Mat shape0 ('S channels0) ('S depth0)))我喜欢这个:
gaussianBlurImage :: (M.Mat shape0 ('S channels0) ('S depth0)) -> Either CV.CvException (M.Mat shape0 ('S channels0) ('S depth0))也许有什么事要做。
我用medianBlur、blur和gaussianBlur试过。我使用了一个不调整大小的图像,一个有三个通道的图像,另一个有2(颜色和灰色)的图像,而且我总是得到相同的错误。我想知道这个错误是否在M.unsafeCoerceMat image中。为什么'True会像预期的那样?我不知道
发布于 2016-09-28 12:28:04
haskell-opencv是一个优秀的库,但有时它很难使用,因为有大量的文档,但是很难理解,并且没有太多的例子。
在那里,每个模糊函数都需要一个(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来获取图像。
但最重要的是函数的定义。我的代码有问题。depth不能模棱两可,这就是为什么我写到:
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))下面是一个完整的例子。我得到一个图像,调整它的大小,模糊它并显示它。
Main:
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 10000Lib:
{-# 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 $ resizedBlurImage:
{-# 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://stackoverflow.com/questions/39661287
复制相似问题