我试图将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但我无法在那里得到答案。
有什么想法吗?
答案 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
我希望它有助于某人。