C++ 从haskell调用C opencv函数
我正在尝试将OpenCV与Haskell一起使用。我的想法是从Haskell .c/p>调用C++函数。 现在我正在这样做: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 =
{-# 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