HOpenCV 0.3.0.1 → 0.4.0.0
raw patch · 4 files changed
+43/−57 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- AI.CV.OpenCV.CxCore: c_releaseImage :: Ptr Priv_IplImage -> IO ()
- AI.CV.OpenCV.CxCore: c_releaseMemStorage :: Ptr Priv_CvMemStorage -> IO ()
- AI.CV.OpenCV.CxCore: releaseImage :: IplImage -> IO ()
- AI.CV.OpenCV.CxCore: releaseMemStorage :: MemStorage -> IO ()
- AI.CV.OpenCV.HighGui: c_releaseCapture :: Ptr Priv_CvCapture -> IO ()
- AI.CV.OpenCV.HighGui: releaseCapture :: Capture -> IO ()
Files
- HOpenCV.cabal +1/−1
- demo/cannyVideo.hs +11/−6
- src/AI/CV/OpenCV/CxCore.hsc +21/−33
- src/AI/CV/OpenCV/HighGui.hsc +10/−17
HOpenCV.cabal view
@@ -1,5 +1,5 @@ name: HOpenCV-version: 0.3.0.1+version: 0.4.0.0 license: GPL-2 maintainer: Noam Lewis <jones.noamle@gmail.com> bug-reports: mailto:jones.noamle@gmail.com
demo/cannyVideo.hs view
@@ -6,15 +6,20 @@ showFrames :: String -> IplImage -> Capture -> IO () showFrames win target cap = do- frame <- queryFrame cap- convertImage frame target 0- canny target target 30 190 3- showImage win target- k <- waitKey 5- when (isNothing k) $ showFrames win target cap+ let step 0 = return ()+ step n = do+ frame <- queryFrame cap+ convertImage frame target 0+ canny target target 30 190 3+ showImage win target+ k <- waitKey 5+ putStr $ "\r" ++ show n ++ "\t\t frames before exiting...\r"+ when (isNothing k) $ step (n - 1)+ step 100 main :: IO () main = do+ putStrLn "Running..." let win = "win" namedWindow win autoSize cap <- createCameraCapture 0
src/AI/CV/OpenCV/CxCore.hsc view
@@ -54,7 +54,7 @@ data CvRect = CvRect { rectX :: CInt, rectY :: CInt, rectWidth :: CInt, rectHeight :: CInt } deriving (Show, Eq)- + instance Storable CvRect where sizeOf _ = (#size CvRect) alignment _ = alignment (undefined :: CInt)@@ -69,8 +69,8 @@ (#poke CvRect, y) ptr y (#poke CvRect, width) ptr w (#poke CvRect, height) ptr h- + liftCvRect :: (RealFrac c, Num b) => (b -> c) -> CvRect -> CvRect liftCvRect f (CvRect x y w h) = CvRect (f' x) (f' y) (f' w) (f' h) where f' = toFromIntegral f@@ -87,7 +87,7 @@ instance VectorSpace CvRect where type Scalar CvRect = Double -- todo: use CInt instead of Double here? a *^ r = liftCvRect (a*) r- + ------------------------------------------------------ {- data Priv_CvArr@@ -103,10 +103,10 @@ data Priv_CvSeq a type CvSeq a = ForeignPtr (Priv_CvSeq a) -newtype Depth = Depth { unDepth :: CInt } +newtype Depth = Depth { unDepth :: CInt } deriving (Eq, Show)- -#{enum Depth, Depth ++#{enum Depth, Depth , iplDepth1u = IPL_DEPTH_1U , iplDepth8u = IPL_DEPTH_8U , iplDepth8s = IPL_DEPTH_8S@@ -115,7 +115,7 @@ , iplDepth32s = IPL_DEPTH_32S , iplDepth32f = IPL_DEPTH_32F , iplDepth64f = IPL_DEPTH_64F-} +} validDepths :: [Depth] validDepths = [iplDepth1u, iplDepth8u, iplDepth8s, iplDepth16u, iplDepth16s, iplDepth32s, iplDepth32f, iplDepth64f]@@ -125,7 +125,7 @@ numToDepth :: CInt -> Maybe Depth numToDepth x = lookup x depthsLookupList- + --------------------------------------------------------------- -- mem storage @@ -135,15 +135,9 @@ foreign import ccall unsafe "HOpenCV_wrap.h &release_mem_storage" cf_releaseMemStorage :: FunPtr (Ptr Priv_CvMemStorage -> IO ()) -foreign import ccall unsafe "HOpenCV_wrap.h release_mem_storage" - c_releaseMemStorage :: Ptr Priv_CvMemStorage -> IO ()- -releaseMemStorage :: MemStorage -> IO ()-releaseMemStorage memstorage = withForeignPtr memstorage c_releaseMemStorage- createMemStorage :: Int -> IO MemStorage-createMemStorage i - = do p <- errorName "Failed to create mem storage" +createMemStorage i+ = do p <- errorName "Failed to create mem storage" . checkPtr . c_cvCreateMemStorage $ fromIntegral i newForeignPtr cf_releaseMemStorage p @@ -158,19 +152,13 @@ createImage :: CvSize -> Depth -> Int -> IO IplImage createImage size depth numChans- = do im <- errorName "Failed to create image" . checkPtr + = do im <- errorName "Failed to create image" . checkPtr $ c_cvCreateImage (sizeWidth size) (sizeHeight size) (unDepth depth) (fromIntegral numChans) fp <- newForeignPtr cvFree im return fp -foreign import ccall unsafe "HOpenCV_wrap.h release_image"- c_releaseImage :: Ptr Priv_IplImage -> IO ()--releaseImage :: IplImage -> IO ()-releaseImage image = withForeignPtr image c_releaseImage- -- foreign import ccall unsafe "HOpenCV_wrap.h &release_image" -- cp_release_image :: FunPtr (Ptr Priv_IplImage -> IO ()) @@ -180,17 +168,17 @@ cloneImage :: IplImage -> IO IplImage cloneImage p- = do p' <- errorName "Failed to clone image" . checkPtr + = do p' <- errorName "Failed to clone image" . checkPtr $ withForeignPtr p c_cvCloneImage fp <- newForeignPtr cvFree p'- return fp - + return fp+ foreign import ccall unsafe "HOpenCV_wrap.h get_size" c_get_size :: Ptr Priv_IplImage -> Ptr CvSize -> IO () foreign import ccall unsafe "cxcore.h cvCopy" c_cvCopy :: Ptr Priv_IplImage -> Ptr Priv_IplImage -> Ptr Priv_IplImage -> IO ()- + -- todo add mask support copy :: IplImage -> IplImage -> IO () copy src dst@@ -225,7 +213,7 @@ getDepth :: IplImage -> IO Depth getDepth img = do- depthInt <- withForeignPtr img c_get_depth + depthInt <- withForeignPtr img c_get_depth case numToDepth depthInt of Nothing -> fail "Bad depth in image struct" Just depth -> return depth@@ -272,16 +260,16 @@ $ c_cvLoad filenameC mem' nameC ptrRealNameC ptrObj <- withForeignPtr mem g realNameC <- peek ptrRealNameC- realName <- if realNameC == nullPtr - then return Nothing + realName <- if realNameC == nullPtr+ then return Nothing else fmap Just $ peekCString realNameC -- cvFree realNameC fp <- newForeignPtr cvFree ptrObj return (fp, realName)- + foreign import ccall unsafe "cxcore.h cvGetSeqElem" cvGetSeqElem :: Ptr (Priv_CvSeq a) -> CInt -> IO (Ptr a)- + -- foreign import ccall unsafe "HOpenCV_wrap.h c_rect_cvGetSeqElem" -- cvGetSeqElemRect :: Ptr (CvSeq (Ptr CvRect)) -> CInt -> IO (Ptr CvRect) @@ -308,7 +296,7 @@ -- seqToRectList :: Ptr (CvSeq (Ptr CvRect)) -> IO [CvRect] -- seqToRectList pseq = do--- numElems <- withForeignPtr pseq seqNumElems +-- numElems <- withForeignPtr pseq seqNumElems -- flip mapM [1..(numElems)] $ \i -> do -- rectP <- cvGetSeqElemRect pseq i -- rect <- peek rectP
src/AI/CV/OpenCV/HighGui.hsc view
@@ -1,7 +1,7 @@ {-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}- + module AI.CV.OpenCV.HighGui where- + import Control.Monad import Foreign.ForeignPtrWrap import Foreign.C.Types@@ -10,7 +10,7 @@ import Foreign.C.String import Foreign.Marshal import Foreign.Storable- + import AI.CV.OpenCV.CxCore import AI.CV.OpenCV.Util @@ -35,7 +35,7 @@ foreign import ccall unsafe "highgui.h cvCreateCameraCapture" c_cvCreateCameraCapture :: CInt -> IO (Ptr Priv_CvCapture)- + -- | self-documenting camera specification pickAnyCam :: Int pickAnyCam = -1@@ -48,27 +48,20 @@ createCameraCapture x = do p <- errorName "Failed to create camera" . checkPtr $ c_cvCreateCameraCapture . fromIntegral $ x newForeignPtr cp_release_capture p- + foreign import ccall unsafe "highgui.h cvCreateFileCapture" c_cvCreateFileCapture :: CString -> IO (Ptr Priv_CvCapture)- + createFileCapture :: String -> IO Capture createFileCapture filename = do c <- err' . checkPtr $ withCString filename f newForeignPtr cp_release_capture c where err' = errorName $ "Failed to capture from file: '" ++ filename ++ "'" f filenameC = c_cvCreateFileCapture filenameC- -foreign import ccall unsafe "HOpenCV_wrap.h release_capture"- c_releaseCapture :: Ptr Priv_CvCapture -> IO ()- -releaseCapture :: Capture -> IO () -releaseCapture cap = withForeignPtr cap c_releaseCapture- foreign import ccall unsafe "HOpenCV_wrap.h &release_capture" cp_release_capture :: FunPtr (Ptr Priv_CvCapture -> IO ())- + foreign import ccall unsafe "highgui.h cvQueryFrame" c_cvQueryFrame :: Ptr Priv_CvCapture -> IO (Ptr Priv_IplImage) @@ -103,7 +96,7 @@ destroyWindow :: String -> IO () destroyWindow wId- = withCString wId cvDestroyWindow + = withCString wId cvDestroyWindow foreign import ccall unsafe "highgui.h cvShowImage" cvShowImage :: CString -> Ptr Priv_IplImage -> IO ()@@ -135,7 +128,7 @@ loadImage :: String -> LoadImageColor -> IO IplImage loadImage filename (LoadImageColor color)- = do i <- err' . checkPtr $ withCString filename + = do i <- err' . checkPtr $ withCString filename $ \fn -> c_cvLoadImage fn color fp <- newForeignPtr cvFree i return fp@@ -164,7 +157,7 @@ createTrackbar trackbarName winName startPosition maxValue = withCString trackbarName $ \tb -> withCString winName $ \wn ->- alloca $ \sp -> + alloca $ \sp -> do maybeToPtr sp startPosition wrap_createTrackbar tb wn sp (fromIntegral maxValue) where