关于C#:从haskell调用一个C opencv函数 | 珊瑚贝

Calling a C opencv function from haskell


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

现在我正在这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{# 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: can’t find label
During interactive linking, GHCi couldn’t find the following symbol:
_ZN2cv6imreadERKNS_6StringEi

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

我还阅读了:FFI 烹饪书但我无法在那里得到我的问题的答案。

有什么想法吗?

  • 你如何告诉 GHCi 哪些库要搜索这个符号?
  • 这是个好问题。我不知道。我在这里看不到:来自 Haskell 的 CPlusPlus,他在哪里做。我想也许在阴谋集团文件中。像这样: library hs-source-dirs: src exposed-modules: Lib build-depends: base >= 4.7 && < 5 default-language: Haskell2010 带有 ghci 选项,但我不
  • 如果您有 cabal 文件,请尝试使用 cabal repl 而不是 ghci。 Cabal 应该告诉 ghci 使用哪些库。
  • 我尝试了 cabal repl 和 stack repl,但仍然遇到同样的错误。我应该在哪里指定库? @n.m。
  • 你能用 Cabal 或 stack 构建一个独立的可执行文件吗?
  • 对不起,我不知道你对独立的确切含义。如果这是您的问题,我已经用堆栈构建了它。该文件夹包含一个 cabal 文件、一个 Setup.hs、堆栈 yaml 和 src。
  • 让我们在聊天中继续这个讨论。
  • 无论如何,您的程序都无法运行,因为 OpenCV 的 String 类型不是 C 字符串。
  • 我建议尝试使用现有的 OpenCV 绑定,例如 github.com/LumiGuide/haskell-opencv。
  • 是的,它有效,谢谢!这是一个不错的项目。


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

这是一个使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 我添加了这个:

1
2
3
4
5
packages:    
  location:
    git: https://github.com/LumiGuide/haskell-opencv.git
    commit: 07afde39fa16f7a4282d4a812e70b9ed33d0f3ef
  ‘.’

因此看起来是 cabal 文件的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
library  
 hssourcedirs:      src
  exposedmodules:     Lib
  builddepends:       base >= 4.7 && < 5
                     , opencv
                     , bytestring
  defaultlanguage:    Haskell2010

 executable simpleexe
  hssourcedirs:      app
  mainis:             Main.hs
  ghcoptions:         threaded rtsopts withrtsopts=N
  builddepends:       base
                     , simple
                     , opencv
                     , bytestring
  defaultlanguage:    Haskell2010

 testsuite simpletest
  type:                exitcodestdio1.0
  hssourcedirs:      test
  mainis:             Spec.hs
  builddepends:       base
                     , simple
                     , opencv
                     , bytestring
  ghcoptions:         threaded rtsopts withrtsopts=N
  defaultlanguage:    Haskell2010

我希望它可以帮助某人。

  • haskell-opencv 不能通过 hackage 获得,是吗?


来源:https://www.codenong.com/39505855/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9731.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?