首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中的GaussianBlurImage -OpenCV (Haskell与OpenCV3.1的绑定)

Haskell中的GaussianBlurImage -OpenCV (Haskell与OpenCV3.1的绑定)
EN

Stack Overflow用户
提问于 2016-09-23 12:52:55
回答 1查看 185关注 0票数 1

啊!

我正在使用haskell-opencv库。我不知道是否有其他人在使用它,或者对它有所了解。

我试图使用gaussianBlurImage,但有一个错误我无法识别。

我有这个:

代码语言:javascript
复制
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有这样的类型:

代码语言:javascript
复制
gaussianBlurImage :: (M.Mat shape0 ('S channels0) ('S depth0)) -> Either CV.CvException (Either CV.CvException (M.Mat shape0 ('S channels0) ('S depth0)))

我喜欢这个:

代码语言:javascript
复制
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会像预期的那样?我不知道

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-28 12:28:04

haskell-opencv是一个优秀的库,但有时它很难使用,因为有大量的文档,但是很难理解,并且没有太多的例子。

在那里,每个模糊函数都需要一个(M.Mat shape ('S channels) ('S depth))矩阵,但是矩阵通常是这样的:(M.Mat shape channels depth),其中'S告诉它是静态的。

我使用这个函数:

M.coerceMat有这样一个矩阵。

代码语言:javascript
复制
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不能模棱两可,这就是为什么我写到:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{-# 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:

代码语言:javascript
复制
{-# 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:

代码语言:javascript
复制
{-# 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

就是这样。)我希望它能对某人有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39661287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档