Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从haskell调用C opencv函数_C++_C_Opencv_Haskell - Fatal编程技术网

C++ 从haskell调用C opencv函数

C++ 从haskell调用C opencv函数,c++,c,opencv,haskell,C++,C,Opencv,Haskell,我正在尝试将OpenCV与Haskell一起使用。我的想法是从Haskell .c/p>调用C++函数。 现在我正在这样做: {-# LANGUAGE ForeignFunctionInterface #-} module Lib ( someFunc ) where import Foreign.C import Foreign.C.String import Foreign.C.Types import Foreign.Ptr data LplROI =

我正在尝试将OpenCV与Haskell一起使用。我的想法是从Haskell .c/p>调用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
{-#语言外来函数接口#-}
模块库
(
someFunc
)在哪里
进口外国货
输入外文字符串
导入外国C.C.类型
进口外国货
数据LplROI=LplROI{
coi::辛特,
xOffset::CInt,
约夫特:辛特
}
数据LpImage=LpImage{
align::CInt,
alphaChannel::CInt,
边界常数:CInt,
borderMode::CInt,
channelSeq::CChar,
颜色模型::CChar,
数据顺序::CInt,
深度:辛特,
高度:CInt,
id::CInt,
图像数据::CChar,
mageDataOrigin::CChar,
imageId::CChar,
imageSize::CInt,
maskROI::LpImage,
nChannels::CInt,
nSize::CInt,
起源:辛特,
投资回报率:LplROI,
tileInfo::CChar,
宽度:CInt,
宽度步长::CInt
}
国外进口ccall“\u ZN2cv6imreadERKNS\u 6StringEi”imRead\u imRead::CString->CInt->IO(Ptr LpImage)
someFunc=do

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

下面是一个使用示例:

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
这是阴谋集团档案的一部分:

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
库
hs源目录:src
公开模块:Lib
构建取决于:基础>=4.7&<5
,opencv
,bytestring
默认语言:Haskell 2010
可执行简单exe
hs源目录:应用程序
main是:main.hs
--ghc选项:-threaded-rtsopts-with-rtsopts=-N
构建取决于:基础
,简单
,opencv
,bytestring
默认语言:Haskell 2010
测试套件简单测试
类型:exitcode-stdio-1.0
hs源目录:测试
主要是:规格hs
构建取决于:基础
,简单
,opencv
,bytestring
--ghc选项:-threaded-rtsopts-with-rtsopts=-N
默认语言:Haskell 2010

我希望它能帮助别人

您如何告诉GHCi哪些库要搜索此符号?这是一个好问题。我不知道。我看不出他是在哪里做的。我想可能在阴谋集团的档案里。类似这样的内容:
library hs-source-dirs:src-exposed-modules:Lib-build-dependens:base>=4.7&&<5默认语言:haskell 2010
,带有ghci选项,但我不确定。如果您有阴谋集团文件,请尝试
cabal-repl
而不是
ghci
。阴谋集团应该告诉ghci使用哪种LIB。我尝试了
Cabal repl
stack repl
,但仍然得到相同的错误。我应该在哪里指定LIB@n、 m.我建议尝试使用现有的OpenCV绑定,比如。
haskell OpenCV
无法通过hackage获得,是吗?
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