从haskell调用C opencv函数

我正在尝试将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 

我从Haskell读了这篇文章CPlusPlus ,所以我得到了名字_ZN2cv6imreadERKNS_6StringEi 。 在2.1.1中找到受损的命名

但GHCi说:

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

在Python中我应该“导入cv2”,但我不知道它如何在Haskell上运行。

我也读过: FFI烹饪书但我无法在那里得到答案。

任何的想法?

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

这是一个使用示例:

 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 

我希望它对某人有帮助。