module AI.CV.OpenCV.HighGui where
import Control.Monad
import Foreign.ForeignPtrWrap
import Foreign.C.Types
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.C.String
import AI.CV.OpenCV.CxCore
foreign import ccall unsafe "highgui.h cvConvertImage"
c_cvConvertImage :: Ptr CvArr -> Ptr CvArr -> CInt -> IO ()
cvConvertImage :: (IplArrayType a, IplArrayType a1) => Ptr a -> Ptr a1 -> CInt -> IO ()
cvConvertImage src dst flags = c_cvConvertImage (fromArr src) (fromArr dst) flags
data CvCapture
foreign import ccall unsafe "highgui.h cvCreateCameraCapture"
c_cvCreateCameraCapture :: CInt -> IO (Ptr CvCapture)
cvCreateCameraCapture :: CInt -> IO (Ptr CvCapture)
cvCreateCameraCapture x = errorName "Failed to create camera" . checkPtr $ c_cvCreateCameraCapture . fromIntegral $ x
foreign import ccall unsafe "highgui.h cvCreateFileCapture"
c_cvCreateFileCapture :: CString -> IO (Ptr CvCapture)
cvCreateFileCapture :: String -> IO (Ptr CvCapture)
cvCreateFileCapture filename = err' . checkPtr $ withCString filename f
where err' = errorName $ "Failed to capture from file: '" ++ filename ++ "'"
f filenameC = c_cvCreateFileCapture filenameC
foreign import ccall unsafe "HOpenCV_warp.h release_capture"
cvReleaseCapture :: Ptr CvCapture -> IO ()
foreign import ccall unsafe "HOpenCV_warp.h &release_capture"
cp_release_capture :: FunPtr (Ptr CvCapture -> IO () )
createCameraCaptureF :: CInt -> IO (ForeignPtr CvCapture)
createCameraCaptureF = (createForeignPtr cp_release_capture) . cvCreateCameraCapture
foreign import ccall unsafe "highgui.h cvQueryFrame"
c_cvQueryFrame :: Ptr CvCapture -> IO (Ptr IplImage)
cvQueryFrame :: Ptr CvCapture -> IO (Ptr IplImage)
cvQueryFrame cap = errorName "Failed to query frame from camera" . checkPtr $ c_cvQueryFrame cap
foreign import ccall unsafe "HOpenCV_wrap.h new_window"
c_newWindow :: CInt -> CInt -> IO ()
newWindow :: CInt -> Bool -> IO ()
newWindow num autoSize = c_newWindow num (if autoSize then 1 else 0)
foreign import ccall unsafe "HOpenCV_wrap.h del_window"
delWindow :: CInt -> IO ()
foreign import ccall unsafe "HOpenCV_wrap.h show_image"
showImage :: CInt -> Ptr IplImage -> IO ()
foreign import ccall unsafe "highgui.h cvWaitKey"
waitKey :: CInt -> IO CInt
foreign import ccall unsafe "highgui.h cvNamedWindow"
cvNamedWindow :: CString -> CInt -> IO CInt
type AutoSize = Bool
titledWindow :: String -> AutoSize -> IO Int
titledWindow s a
= do cs <- newCString s
i <- cvNamedWindow cs (fromToInteger $ fromEnum a)
return $ fromToInteger i
fromToInteger :: (Integral a, Num b) => a -> b
fromToInteger = fromInteger . toInteger
newtype LoadImageColor = LoadImageColor { unLoadImageColor :: CInt }
loadImageColor :: LoadImageColor
loadImageColor = LoadImageColor 1
loadImageGrayscale :: LoadImageColor
loadImageGrayscale = LoadImageColor 0
loadImageUnchanged :: LoadImageColor
loadImageUnchanged = LoadImageColor (1)
foreign import ccall unsafe "highgui.h cvLoadImage"
c_cvLoadImage :: CString -> CInt -> IO (Ptr IplImage)
cvLoadImage :: String -> LoadImageColor -> IO (Ptr IplImage)
cvLoadImage filename (LoadImageColor color) = err' . checkPtr $ withCString filename f
where
err' = errorName $ "Failed to load from file: '" ++ filename ++ "'"
f filenameC = c_cvLoadImage filenameC color
foreign import ccall unsafe "highgui.h cvSaveImage"
c_cvSaveImage :: CString -> Ptr CvArr -> IO CInt
cvSaveImage :: String -> Ptr IplImage -> IO CInt
cvSaveImage filename image = withCString filename f
where
f filenameC = do
ret <- c_cvSaveImage filenameC (fromArr image)
when (ret == 0) $ fail $ "Failed to save to file: '" ++ filename ++ "'"
return ret