2016-09-23 7 views
0

H!haskell-opencv(OpenCV-3.1へのHaskellバインディング)のGaussianBlurImage

私はhaskell-opencvライブラリを使用しています。私は別の人がそれを使っているのか、それについて何かを知っています。

私はgaussianBlurImageを使用しようとしていましたが、認識できないエラーがあります。 をリサイズ

cropped image = do 
    resized <- resizeImage image 
    gaussianBlurred <- gaussianBlurImage ((M.unsafeCoerceMat . getImageFromEither) resized) 

どちらかCV.Exception(M.Mat形状チャンネルの深さ)そして、私はここに((M.unsafeCoerceMat . getImageFromEither) resized)Mat shape (S channels) (S depth) gaussianBlurImage機能のニーズなどから取得することです:

は、私はこれを持っています。

私はそうgaussianBlurImageを定義したザ・:

gaussianBlurImage image = runExceptT $ CV.pureExcept $ CV.gaussianBlur (V2 13 13 :: V2 Int32) 0 0 image

そして、私のために、それが正常に見えます。同様に:blur。私gaussianBlurImageこのタイプを持っていることを、私は気づいた

Couldn't match expected type ‘'True’ with actual type ‘Elem depth0 '[Word8, Word16, Float, Double]’

:しかし、私はこのエラーを取得する

gaussianBlurImage :: (M.Mat shape0 ('S channels0) ('S depth0)) -> Either CV.CvException (Either CV.CvException (M.Mat shape0 ('S channels0) ('S depth0))) 

そして、私はこの1つを気に入っ:

gaussianBlurImage :: (M.Mat shape0 ('S channels0) ('S depth0)) -> Either CV.CvException (M.Mat shape0 ('S channels0) ('S depth0)) 

多分それは何かを持っています。

私はmedianBlur、blur、gaussianBlurを試しました。私はサイズ変更されていない画像と、3チャンネルの画像と2(色と灰色)の画像を使用しました。私はいつも同じエラーが発生します。私は、エラーがM.unsafeCoerceMat imageにあるのだろうかと思っています。そして、なぜ'Trueが期待どおりのタイプですか?私は考えがありません

+1

あなたは、完全な例を最低限提供できますか?あなたが提供した断片は、誰かがファイルに貼り付けて自分自身をコンパイルしようとするものではありません。 –

+0

ここに要点があります:[要点](https://gist.github.com/Chuck-Aguilar/2a4a0506c2924c4d72134a45dc19935c) 問題は「深さ」のタイプであることがわかりました。 '[Word8、Word16、Float]、チャンネル 'In' [1,3、4])=>'しかし、それでも動作しません。私はこのエラーが発生します: 'タイプ 'IO'と 'CV.CvExceptionがどちらかと一致しませんでした'予想されるタイプ:どちらかCV.CvException()実際のタイプ:IO()'それは異常です。画像。 –

答えて

1

は優れたライブラリですが、ドキュメントがたくさんあるので理解しづらいので、使用するのが難しい場合もありますし、多くの例はありません。

すべてのぼかし関数には(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 

それだけです。 :)私はそれが誰かを助けることを願っています

関連する問題