opencv 0.0.1.1 → 0.0.2.0
raw patch · 17 files changed
+185/−13 lines, 17 filesbinary-added
Files
- CHANGELOG.md +18/−0
- doc/generated/examples/animation.gif binary
- doc/generated/examples/bilateralFilterImg.png binary
- doc/generated/examples/boxBlurImg.png binary
- doc/generated/examples/decolorImg.png binary
- doc/generated/examples/fastNlMeansDenoisingColoredImg.png binary
- doc/generated/examples/fastNlMeansDenoisingColoredMultiImg.png binary
- doc/generated/examples/fbMatcherImg.png binary
- doc/generated/examples/fromJuicyImg.png binary
- doc/generated/examples/fromJuicyPixelsImg.png binary
- doc/generated/examples/matSubRectImg.png binary
- doc/generated/examples/undistortImg.png binary
- opencv.cabal +3/−3
- src/OpenCV/Core/ArrayOps.cpp +15/−0
- src/OpenCV/Core/ArrayOps.hs +36/−1
- src/OpenCV/ImgProc/ImgFiltering.cpp +34/−9
- src/OpenCV/ImgProc/ImgFiltering.hsc +79/−0
CHANGELOG.md view
@@ -1,3 +1,20 @@+## [0.0.2.0] - 2017-11-06++- Support OpenCV-3.3.x++### Added++- OpenCV.Core.ArrayOps.perspectiveTransform+- OpenCV.ImgProc.ImgFiltering.bilateralFilter++### Changed++- Specify the more accurate `pkgconfig-depends: opencv >= 3.0.0` so that Cabal+ doesn't use the wrong version..+- Specify the more accurate `setup-depends: Cabal >= 1.23` to prevent building+ with unsupported Cabals.++ ## [0.0.1.1] - 2017-06-23 ### Changed@@ -25,5 +42,6 @@ - Initial version +[0.0.2.0]: https://github.com/LumiGuide/haskell-opencv/compare/opencv-0.0.1.1...opencv-0.0.2.0 [0.0.1.1]: https://github.com/LumiGuide/haskell-opencv/compare/opencv-0.0.1.0...opencv-0.0.1.1 [0.0.1.0]: https://github.com/LumiGuide/haskell-opencv/compare/opencv-0.0.0.0...opencv-0.0.1.0
− doc/generated/examples/animation.gif
binary file changed (20183 → absent bytes)
+ doc/generated/examples/bilateralFilterImg.png view
binary file changed (absent → 471516 bytes)
doc/generated/examples/boxBlurImg.png view
binary file changed (440308 → 439991 bytes)
doc/generated/examples/decolorImg.png view
binary file changed (940483 → 940482 bytes)
doc/generated/examples/fastNlMeansDenoisingColoredImg.png view
binary file changed (913667 → 913653 bytes)
doc/generated/examples/fastNlMeansDenoisingColoredMultiImg.png view
binary file changed (913667 → 913653 bytes)
doc/generated/examples/fbMatcherImg.png view
binary file changed (513475 → 513844 bytes)
− doc/generated/examples/fromJuicyImg.png
binary file changed (523220 → absent bytes)
− doc/generated/examples/fromJuicyPixelsImg.png
binary file changed (523220 → absent bytes)
doc/generated/examples/matSubRectImg.png view
binary file changed (477260 → 476960 bytes)
doc/generated/examples/undistortImg.png view
binary file changed (215796 → 215812 bytes)
opencv.cabal view
@@ -1,5 +1,5 @@ name: opencv-version: 0.0.1.1+version: 0.0.2.0 homepage: https://github.com/LumiGuide/haskell-opencv bug-reports: https://github.com/LumiGuide/haskell-opencv/issues license: BSD3@@ -48,7 +48,7 @@ manual: True custom-setup- setup-depends: base, Cabal+ setup-depends: base, Cabal >= 1.23 library hs-source-dirs: src@@ -209,7 +209,7 @@ TypeOperators default-language: Haskell2010- pkgconfig-depends: opencv+ pkgconfig-depends: opencv >= 3.0.0 extra-libraries: stdc++ test-suite doc-images-opencv
src/OpenCV/Core/ArrayOps.cpp view
@@ -483,3 +483,18 @@ } }++extern "C" {+void inline_c_OpenCV_Core_ArrayOps_26_228e7ff428ad599703e14a00252d380743ce0af1(Point2d * srcPtr_inline_c_0, int32_t cnumPts_27_inline_c_1, Point2d * dstPtr_27_inline_c_2, int32_t cnumPts_27_inline_c_3, Mat * tmPtr_inline_c_4) {++ cv::_InputArray srcPts = cv::_InputArray( srcPtr_inline_c_0, cnumPts_27_inline_c_1);+ cv::_OutputArray dstPts = cv::_OutputArray(dstPtr_27_inline_c_2, cnumPts_27_inline_c_3);+ cv::perspectiveTransform+ ( srcPts+ , dstPts+ , *tmPtr_inline_c_4+ );+ +}++}
src/OpenCV/Core/ArrayOps.hs view
@@ -46,13 +46,15 @@ , matTranspose , hconcat , vconcat+ , perspectiveTransform ) where import "base" Data.Proxy ( Proxy(..) ) import "base" Data.Word+import "base" Foreign.C.Types ( CDouble ) import "base" Foreign.Marshal.Alloc ( alloca ) import "base" Foreign.Marshal.Array ( allocaArray, peekArray )-import "base" Foreign.Ptr ( Ptr )+import "base" Foreign.Ptr ( Ptr, castPtr ) import "base" Foreign.Storable ( Storable(..), peek ) import "base" GHC.TypeLits import "base" Data.Int ( Int32 )@@ -998,3 +1000,36 @@ where c'numMats :: C.CSize c'numMats = fromIntegral $ V.length mats+++{-| Performs the perspective matrix transformation of vectors.++ TODO: Modify this function for accept 3D points+ TODO: Generalize return type to+ V.Vector (point2 CDouble)++<http://docs.opencv.org/3.0-last-rst/modules/core/doc/operations_on_arrays.html#perspectivetransform OpenCV Sphinx doc>+-}+perspectiveTransform+ :: (IsPoint2 point2 CDouble)+ => V.Vector (point2 CDouble)+ -> Mat ('S '[ 'S 3, 'S 3 ]) ('S 1) ('S Double)+ -> V.Vector Point2d+perspectiveTransform srcPoints transformationMat = unsafePerformIO $+ withArrayPtr (V.map toPoint srcPoints) $ \srcPtr ->+ withPtr transformationMat $ \tmPtr ->+ allocaArray numPts $ \(dstPtr :: Ptr (V2 CDouble)) -> do+ let dstPtr' = castPtr dstPtr+ [C.block| void {+ cv::_InputArray srcPts = cv::_InputArray( $(Point2d * srcPtr), $(int32_t c'numPts));+ cv::_OutputArray dstPts = cv::_OutputArray($(Point2d * dstPtr'), $(int32_t c'numPts));+ cv::perspectiveTransform+ ( srcPts+ , dstPts+ , *$(Mat * tmPtr)+ );+ }|]+ peekArray numPts dstPtr >>= return . V.fromList . map toPoint+ where+ numPts = fromIntegral $ V.length srcPoints+ c'numPts = fromIntegral $ V.length srcPoints
src/OpenCV/ImgProc/ImgFiltering.cpp view
@@ -6,10 +6,35 @@ using namespace cv; extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_0_e376504d66a67a81166f6a7de96ff685ab99ae52(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, int32_t cddepth_27_inline_c_2, int32_t cksize_27_inline_c_3, double cscale_27_inline_c_4, double cdelta_27_inline_c_5, int32_t cborderType_27_inline_c_6) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_0_7d3d053e68542f65ab73e44b4db97dfe42c74c51(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, int32_t cd_27_inline_c_2, double csigmaColor_27_inline_c_3, double csigmaSpace_27_inline_c_4, int32_t cborderType_27_inline_c_5) { try { + cv::bilateralFilter+ ( *srcPtr_inline_c_0+ , *dstPtr_inline_c_1+ , cd_27_inline_c_2+ , csigmaColor_27_inline_c_3+ , csigmaSpace_27_inline_c_4+ , cborderType_27_inline_c_5+ );+ + return NULL;+ }+ catch (const cv::Exception & e)+ {+ return new cv::Exception(e);+ }++}++}++extern "C" {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_1_e376504d66a67a81166f6a7de96ff685ab99ae52(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, int32_t cddepth_27_inline_c_2, int32_t cksize_27_inline_c_3, double cscale_27_inline_c_4, double cdelta_27_inline_c_5, int32_t cborderType_27_inline_c_6) {++ try+ { cv::Laplacian ( *srcPtr_inline_c_0 , *dstPtr_inline_c_1@@ -32,7 +57,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_1_345ace375d204c2a7dff8b68ca0269df67bc7938(Mat * matInPtr_inline_c_0, Mat * matOutPtr_inline_c_1, int32_t ksize_inline_c_2) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_2_345ace375d204c2a7dff8b68ca0269df67bc7938(Mat * matInPtr_inline_c_0, Mat * matOutPtr_inline_c_1, int32_t ksize_inline_c_2) { try { cv::medianBlur(*matInPtr_inline_c_0, *matOutPtr_inline_c_1, ksize_inline_c_2); @@ -48,7 +73,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_2_d33ce1e3332ac2ac4dd5246990112c449c582d4c(Mat * matInPtr_inline_c_0, Mat * matOutPtr_inline_c_1, Size2i * ksizePtr_inline_c_2) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_3_d33ce1e3332ac2ac4dd5246990112c449c582d4c(Mat * matInPtr_inline_c_0, Mat * matOutPtr_inline_c_1, Size2i * ksizePtr_inline_c_2) { try { @@ -70,7 +95,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_3_907ecf95556ac76c10894cb3ae59a4e2b7e7ca9b(Mat * matInPtr_inline_c_0, Mat * matOutPtr_inline_c_1, Size2i * ksizePtr_inline_c_2, double csigmaX_27_inline_c_3, double csigmaY_27_inline_c_4) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_4_907ecf95556ac76c10894cb3ae59a4e2b7e7ca9b(Mat * matInPtr_inline_c_0, Mat * matOutPtr_inline_c_1, Size2i * ksizePtr_inline_c_2, double csigmaX_27_inline_c_3, double csigmaY_27_inline_c_4) { try { @@ -94,7 +119,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_4_82421a3cb5054e4b649407f8926c057bfed86a45(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, Mat * kernelPtr_inline_c_2, Point2i * anchorPtr_inline_c_3, int32_t citerations_27_inline_c_4, int32_t cborderType_27_inline_c_5, Scalar * borderValuePtr_inline_c_6) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_5_82421a3cb5054e4b649407f8926c057bfed86a45(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, Mat * kernelPtr_inline_c_2, Point2i * anchorPtr_inline_c_3, int32_t citerations_27_inline_c_4, int32_t cborderType_27_inline_c_5, Scalar * borderValuePtr_inline_c_6) { try { @@ -120,7 +145,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_5_686cd566b987aa9d5ec27846da2b925a79b1c365(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, Mat * kernelPtr_inline_c_2, Point2i * anchorPtr_inline_c_3, double cdelta_27_inline_c_4, int32_t cborderType_27_inline_c_5) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_6_686cd566b987aa9d5ec27846da2b925a79b1c365(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, Mat * kernelPtr_inline_c_2, Point2i * anchorPtr_inline_c_3, double cdelta_27_inline_c_4, int32_t cborderType_27_inline_c_5) { try { @@ -146,7 +171,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_6_93c9df76baf0966fe0e3e5136e89b57d1aea3586(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, Mat * kernelPtr_inline_c_2, Point2i * anchorPtr_inline_c_3, int32_t citerations_27_inline_c_4, int32_t cborderType_27_inline_c_5, Scalar * borderValuePtr_inline_c_6) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_7_93c9df76baf0966fe0e3e5136e89b57d1aea3586(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, Mat * kernelPtr_inline_c_2, Point2i * anchorPtr_inline_c_3, int32_t citerations_27_inline_c_4, int32_t cborderType_27_inline_c_5, Scalar * borderValuePtr_inline_c_6) { try { @@ -172,7 +197,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_7_fe64cf1ef54e417d07f7d0a61e6c49313898058d(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, int32_t cop_27_inline_c_2, Mat * kernelPtr_inline_c_3, Point2i * anchorPtr_inline_c_4, int32_t citerations_27_inline_c_5, int32_t cborderType_27_inline_c_6, Scalar * borderValuePtr_inline_c_7) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_8_fe64cf1ef54e417d07f7d0a61e6c49313898058d(Mat * srcPtr_inline_c_0, Mat * dstPtr_inline_c_1, int32_t cop_27_inline_c_2, Mat * kernelPtr_inline_c_3, Point2i * anchorPtr_inline_c_4, int32_t citerations_27_inline_c_5, int32_t cborderType_27_inline_c_6, Scalar * borderValuePtr_inline_c_7) { try { @@ -199,7 +224,7 @@ } extern "C" {-Exception * inline_c_OpenCV_ImgProc_ImgFiltering_8_7ea2729a8a8a953773da566c07815d3fa635d8e9(Mat * elementPtr_inline_c_0, int32_t cmorphShape_27_inline_c_1, Size2i * ksizePtr_inline_c_2, Point2i * anchorPtr_inline_c_3) {+Exception * inline_c_OpenCV_ImgProc_ImgFiltering_9_7ea2729a8a8a953773da566c07815d3fa635d8e9(Mat * elementPtr_inline_c_0, int32_t cmorphShape_27_inline_c_1, Size2i * ksizePtr_inline_c_2, Point2i * anchorPtr_inline_c_3) { try {
src/OpenCV/ImgProc/ImgFiltering.hsc view
@@ -34,6 +34,7 @@ ( MorphShape(..) , MorphOperation(..) + , bilateralFilter , laplacian , medianBlur , erode@@ -131,6 +132,84 @@ -------------------------------------------------------------------------------- -- Image Filtering --------------------------------------------------------------------------------++{- | Calculates the bilateralFilter of an image++The function applies bilateral filtering to the input image, as described in+<http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html Bilateral_Filtering>+bilateralFilter can reduce unwanted noise very well while keeping edges fairly sharp. However, it is very slow compared to most filters.+Example:++@+bilateralFilterImg+ :: forall (width :: Nat)+ (width2 :: Nat)+ (height :: Nat)+ (channels :: Nat)+ (depth :: *)+ . ( Mat (ShapeT [height, width]) ('S channels) ('S depth) ~ Birds_512x341+ , width2 ~ ((*) width 2) -- TODO (RvD): HSE parse error with infix type operator+ )+ => Mat (ShapeT [height, width2]) ('S channels) ('S depth)+bilateralFilterImg = exceptError $+ withMatM (Proxy :: Proxy [height, width2])+ (Proxy :: Proxy channels)+ (Proxy :: Proxy depth)+ white $ \imgM -> do+ birdsFiltered <- pureExcept $ bilateralFilter (Just 9) Nothing Nothing Nothing birds_512x341+ matCopyToM imgM (V2 0 0) birds_512x341 Nothing+ matCopyToM imgM (V2 w 0) birdsFiltered Nothing+ where+ w = fromInteger $ natVal (Proxy :: Proxy width)+@++<<doc/generated/examples/bilateralFilterImg.png bilateralFilterImg>>++<https://docs.opencv.org/3.0-last-rst/modules/imgproc/doc/filtering.html#bilateralfilter OpenCV Sphinx doc>+-}+bilateralFilter+ :: ( depth `In` '[Word8, Float, Double]+ , channels `In` '[1, 3]+ -- , Length shape <= 2+ )+ => Maybe Int32+ -- ^ Diameter of each pixel neighborhood that is used during filtering.+ -- If it is non-positive, it is computed from sigmaSpace. Default value is 5.+ -> Maybe Double+ -- ^ Filter sigma in the color space. A larger value of the parameter means that farther colors within+ -- the pixel neighborhood (see sigmaSpace) will be mixed together, resulting in larger areas of semi-equal color.+ -- Default value is 50+ -> Maybe Double+ -- ^ Filter sigma in the coordinate space. A larger value of the parameter means that farther pixels will+ -- influence each other as long as their colors are close enough (see sigmaColor ). When d>0, it specifies+ -- the neighborhood size regardless of sigmaSpace. Otherwise, d is proportional to sigmaSpace.+ -- Default value is 50+ -> Maybe BorderMode+ -- ^ Pixel extrapolation method. Default value is BorderReflect101+ -> Mat shape ('S channels) ('S depth)+ -> CvExcept (Mat shape ('S channels) ('S depth))+bilateralFilter d sigmaColor sigmaSpace borderType src = unsafeWrapException $ do+ dst <- newEmptyMat+ handleCvException (pure $ unsafeCoerceMat dst) $+ withPtr src $ \srcPtr ->+ withPtr dst $ \dstPtr ->+ [cvExcept|+ cv::bilateralFilter+ ( *$(Mat * srcPtr )+ , *$(Mat * dstPtr )+ , $(int32_t c'd )+ , $(double c'sigmaColor)+ , $(double c'sigmaSpace)+ , $(int32_t c'borderType)+ );+ |]+ where+ c'd = fromMaybe 5 d+ c'sigmaColor = maybe 50 realToFrac sigmaColor+ c'sigmaSpace = maybe 50 realToFrac sigmaSpace+ c'borderType = fst $ marshalBorderMode $ fromMaybe BorderReflect101 borderType++ {- | Calculates the Laplacian of an image