从haskell

时间:2016-09-15 07:58:30

标签: c++ c opencv haskell

我试图将OpenCV与Haskell一起使用。我的想法是从Haskell调用c ++函数。

现在我正在这样做:

{-# LANGUAGE ForeignFunctionInterface #-}

module Lib
    (
        someFunc
    ) where

import Foreign.C
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr

data LplROI = LplROI {
    coi :: CInt,
    xOffset :: CInt,
    yOffset :: CInt
}

data LpImage = LpImage {
    align :: CInt,
    alphaChannel :: CInt,
    borderConst :: CInt,
    borderMode :: CInt,
    channelSeq :: CChar,
    colorModel :: CChar,
    dataOrder :: CInt,
    depth :: CInt,
    height :: CInt,
    id :: CInt,
    imageData :: CChar, 
    mageDataOrigin :: CChar,
    imageId :: CChar,
    imageSize :: CInt,
    maskROI :: LpImage,
    nChannels :: CInt, 
    nSize :: CInt,
    origin :: CInt,
    roi :: LplROI,
    tileInfo :: CChar,
    width :: CInt,
    widthStep :: CInt
}

foreign import ccall "_ZN2cv6imreadERKNS_6StringEi" imRead_ImRead :: CString -> CInt -> IO (Ptr LpImage)

someFunc = do
    filename <- newCString "/home/chuck/Pictures/such-a-bad-day.jpg"
    imRead_ImRead filename 1

我阅读了这篇文章CPlusPlus from Haskell,因此我得到了名称​​ _ZN2cv6imreadERKNS_6StringEi 。在 2.1.1中找到受损的名为

但GHCi说:

  

ByteCodeLink:无法找到标签   在交互式链接期间,GHCi无法找到以下符号:     _ZN2cv6imreadERKNS_6StringEi

在Python中,我应该&#34;导入cv2&#34;,但我不知道它在Haskell上是如何工作的。

我也读过:FFI cook book但我无法在那里得到答案。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我所尝试的并不起作用。 OpenCV api是用C ++编写的。这就是为什么调用它的方式是:C++ from haskell。但是当您在&#34; / usr / lib /&#34;中安装OpenCV时,您不会获得像 cv2.so 这样的.so文件。这意味着使用foreign import ccall非常困难,因为没有构建c-name。 所以,我使用@ReidBarton所说的&#34; haskell-opencv&#34;它工作得很好。或者至少比其他方式更容易。

这是一个使用示例:

module Lib
( someFunc
) where

import Control.Monad ( void )
import qualified OpenCV as CV
import qualified Data.ByteString as B

someFunc :: IO ()
someFunc = do
    img <- CV.imdecode CV.ImreadUnchanged <$> B.readFile "/some_pic.jpg"
    CV.withWindow "test" $ \window -> do
     CV.imshow window img
     void $ CV.waitKey 10000

stack.yaml我添加了这个:

packages:    
 - location:
    git: https://github.com/LumiGuide/haskell-opencv.git
    commit: 07afde39fa16f7a4282d4a812e70b9ed33d0f3ef
 - '.'

所以看起来是cabal文件的一部分:

library  
 hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , opencv
                     , bytestring
  default-language:    Haskell2010

 executable simple-exe
  hs-source-dirs:      app
  main-is:             Main.hs
 -- ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , simple
                     , opencv
                     , bytestring
  default-language:    Haskell2010

 test-suite simple-test
  type:                exitcode-stdio-1.0
  hs-source-dirs:      test
  main-is:             Spec.hs
  build-depends:       base
                     , simple
                     , opencv
                     , bytestring
 -- ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  default-language:    Haskell2010

我希望它有助于某人。