Safe Haskell | None |
---|---|
Language | Haskell2010 |
- data Orb
- data OrbScoreType
- data WTA_K
- data OrbParams = OrbParams {
- orb_nfeatures :: !Int32
- orb_scaleFactor :: !Float
- orb_nlevels :: !Int32
- orb_edgeThreshold :: !Int32
- orb_firstLevel :: !Int32
- orb_WTA_K :: !WTA_K
- orb_scoreType :: !OrbScoreType
- orb_patchSize :: !Int32
- orb_fastThreshold :: !Int32
- defaultOrbParams :: OrbParams
- mkOrb :: OrbParams -> Orb
- orbDetectAndCompute :: Orb -> Mat (S [height, width]) channels depth -> Maybe (Mat (S [height, width]) (S 1) (S Word8)) -> CvExcept (Vector KeyPoint, Mat D D D)
- data SimpleBlobDetector
- data SimpleBlobDetectorParams = SimpleBlobDetectorParams {
- blob_minThreshold :: !Float
- blob_maxThreshold :: !Float
- blob_thresholdStep :: !Float
- blob_minRepeatability :: !Int32
- blob_minDistBetweenBlobs :: !Float
- blob_filterByArea :: !(Maybe BlobFilterByArea)
- blob_filterByCircularity :: !(Maybe BlobFilterByCircularity)
- blob_filterByColor :: !(Maybe BlobFilterByColor)
- blob_filterByConvexity :: !(Maybe BlobFilterByConvexity)
- blob_filterByInertia :: !(Maybe BlobFilterByInertia)
- data BlobFilterByArea = BlobFilterByArea {
- blob_minArea :: !Float
- blob_maxArea :: !Float
- data BlobFilterByCircularity = BlobFilterByCircularity {}
- data BlobFilterByColor = BlobFilterByColor {
- blob_blobColor :: !Word8
- data BlobFilterByConvexity = BlobFilterByConvexity {}
- data BlobFilterByInertia = BlobFilterByInertia {}
- defaultSimpleBlobDetectorParams :: SimpleBlobDetectorParams
- mkSimpleBlobDetector :: SimpleBlobDetectorParams -> SimpleBlobDetector
- blobDetect :: SimpleBlobDetector -> Mat (S [height, width]) channels depth -> Maybe (Mat (S [height, width]) (S 1) (S Word8)) -> CvExcept (Vector KeyPoint)
- class DescriptorMatcher a where
- drawMatches :: Mat (S [height, width]) channels depth -> Vector KeyPoint -> Mat (S [height, width]) channels depth -> Vector KeyPoint -> Vector DMatch -> DrawMatchesParams -> CvExcept (Mat (S [D, D]) channels depth)
- data BFMatcher
- newBFMatcher :: NormType -> Bool -> IO BFMatcher
- data FlannBasedMatcher
- data FlannIndexParams
- = FlannKDTreeIndexParams { }
- | FlannLshIndexParams {
- tableNumber :: Int
- keySize :: Int
- multiProbeLevel :: Int
- data FlannSearchParams = FlannSearchParams {}
- data FlannBasedMatcherParams = FlannBasedMatcherParams {}
- newFlannBasedMatcher :: FlannBasedMatcherParams -> IO FlannBasedMatcher
ORB
OrbParams | |
|
:: Orb | |
-> Mat (S [height, width]) channels depth | Image. |
-> Maybe (Mat (S [height, width]) (S 1) (S Word8)) | Mask. |
-> CvExcept (Vector KeyPoint, Mat D D D) |
Detect keypoints and compute descriptors
Example:
orbDetectAndComputeImg :: forall (width :: Nat) (height :: Nat) (channels :: Nat) (depth :: *) . (Mat (ShapeT [height, width]) ('S channels) ('S depth) ~ Frog) => Mat (ShapeT [height, width]) ('S channels) ('S depth) orbDetectAndComputeImg = exceptError $ do (kpts, _descs) <- orbDetectAndCompute orb frog Nothing withMatM (Proxy :: Proxy [height, width]) (Proxy :: Proxy channels) (Proxy :: Proxy depth) white $ \imgM -> do void $ matCopyToM imgM (V2 0 0) frog Nothing forM_ kpts $ \kpt -> do let kptRec = keyPointAsRec kpt circle imgM (round <$> kptPoint kptRec :: V2 Int32) 5 blue 1 LineType_AA 0 where orb = mkOrb defaultOrbParams
BLOB
data SimpleBlobDetector Source #
data SimpleBlobDetectorParams Source #
SimpleBlobDetectorParams | |
|
data BlobFilterByArea Source #
data BlobFilterByColor Source #
data BlobFilterByConvexity Source #
data BlobFilterByInertia Source #
:: SimpleBlobDetector | |
-> Mat (S [height, width]) channels depth | Image. |
-> Maybe (Mat (S [height, width]) (S 1) (S Word8)) | Mask. |
-> CvExcept (Vector KeyPoint) |
Detect keypoints and compute descriptors
DescriptorMatcher
class DescriptorMatcher a where Source #
upcast :: a -> BaseMatcher Source #
:: a | |
-> Mat D D D | Query set of descriptors. |
-> Mat D D D | Train set of descriptors. |
-> Maybe (Mat (S [height, width]) (S 1) (S Word8)) | Mask specifying permissible matches between an input query and train matrices of descriptors.. |
-> IO (Vector DMatch) |
:: a | |
-> Mat D D D | Query set of descriptors. |
-> Maybe (Mat (S [height, width]) (S 1) (S Word8)) | Mask specifying permissible matches between an input query and train matrices of descriptors.. |
-> IO (Vector DMatch) |
Match in pre-trained matcher
drawMatches :: Mat (S [height, width]) channels depth -> Vector KeyPoint -> Mat (S [height, width]) channels depth -> Vector KeyPoint -> Vector DMatch -> DrawMatchesParams -> CvExcept (Mat (S [D, D]) channels depth) Source #
BFMatcher
Brute-force descriptor matcher
For each descriptor in the first set, this matcher finds the closest descriptor in the second set by trying each one. This descriptor matcher supports masking permissible matches of descriptor sets.
Example:
bfMatcherImg :: forall (width :: Nat) (width2 :: Nat) (height :: Nat) (channels :: Nat) (depth :: *) . ( Mat (ShapeT [height, width]) ('S channels) ('S depth) ~ Frog , width2 ~ (*) width 2 ) => IO (Mat (ShapeT [height, width2]) ('S channels) ('S depth)) bfMatcherImg = do let (kpts1, descs1) = exceptError $ orbDetectAndCompute orb frog Nothing (kpts2, descs2) = exceptError $ orbDetectAndCompute orb rotatedFrog Nothing bfmatcher <- newBFMatcher Norm_Hamming True matches <- match bfmatcher descs1 -- Query descriptors descs2 -- Train descriptors Nothing exceptErrorIO $ pureExcept $ withMatM (Proxy :: Proxy [height, width2]) (Proxy :: Proxy channels) (Proxy :: Proxy depth) white $ \imgM -> do matCopyToM imgM (V2 0 0) frog Nothing matCopyToM imgM (V2 width 0) rotatedFrog Nothing -- Draw the matches as lines from the query image to the train image. forM_ matches $ \dmatch -> do let matchRec = dmatchAsRec dmatch queryPt = kpts1 V.! fromIntegral (dmatchQueryIdx matchRec) trainPt = kpts2 V.! fromIntegral (dmatchTrainIdx matchRec) queryPtRec = keyPointAsRec queryPt trainPtRec = keyPointAsRec trainPt -- We translate the train point one width to the right in order to -- match the position of rotatedFrog in imgM. line imgM (round <$> kptPoint queryPtRec :: V2 Int32) ((round <$> kptPoint trainPtRec :: V2 Int32) ^+^ V2 width 0) blue 1 LineType_AA 0 where orb = mkOrb defaultOrbParams {orb_nfeatures = 50} width = fromInteger $ natVal (Proxy :: Proxy width) rotatedFrog = exceptError $ warpAffine frog rotMat InterArea False False (BorderConstant black) rotMat = getRotationMatrix2D (V2 250 195 :: V2 CFloat) 45 0.8
:: NormType |
|
-> Bool | If it is false, this is will be default |
-> IO BFMatcher |
FlannBasedMatcher
data FlannBasedMatcher Source #
Flann-based descriptor matcher.
This matcher trains flann::Index_
on a train descriptor collection and calls it
nearest search methods to find the best matches. So, this matcher may be faster
when matching a large train collection than the brute force matcher.
FlannBasedMatcher
does not support masking permissible matches of descriptor
sets because flann::Index does not support this.
Example:
fbMatcherImg :: forall (width :: Nat) (width2 :: Nat) (height :: Nat) (channels :: Nat) (depth :: *) . ( Mat (ShapeT [height, width]) ('S channels) ('S depth) ~ Frog , width2 ~ (*) width 2 ) => IO (Mat (ShapeT [height, width2]) ('S channels) ('S depth)) fbMatcherImg = do let (kpts1, descs1) = exceptError $ orbDetectAndCompute orb frog Nothing (kpts2, descs2) = exceptError $ orbDetectAndCompute orb rotatedFrog Nothing fbmatcher <- newFlannBasedMatcher (def { indexParams = FlannLshIndexParams 20 10 2 }) matches <- match fbmatcher descs1 -- Query descriptors descs2 -- Train descriptors Nothing exceptErrorIO $ pureExcept $ withMatM (Proxy :: Proxy [height, width2]) (Proxy :: Proxy channels) (Proxy :: Proxy depth) white $ \imgM -> do matCopyToM imgM (V2 0 0) frog Nothing matCopyToM imgM (V2 width 0) rotatedFrog Nothing -- Draw the matches as lines from the query image to the train image. forM_ matches $ \dmatch -> do let matchRec = dmatchAsRec dmatch queryPt = kpts1 V.! fromIntegral (dmatchQueryIdx matchRec) trainPt = kpts2 V.! fromIntegral (dmatchTrainIdx matchRec) queryPtRec = keyPointAsRec queryPt trainPtRec = keyPointAsRec trainPt -- We translate the train point one width to the right in order to -- match the position of rotatedFrog in imgM. line imgM (round <$> kptPoint queryPtRec :: V2 Int32) ((round <$> kptPoint trainPtRec :: V2 Int32) ^+^ V2 width 0) blue 1 LineType_AA 0 where orb = mkOrb defaultOrbParams {orb_nfeatures = 50} width = fromInteger $ natVal (Proxy :: Proxy width) rotatedFrog = exceptError $ warpAffine frog rotMat InterArea False False (BorderConstant black) rotMat = getRotationMatrix2D (V2 250 195 :: V2 CFloat) 45 0.8
data FlannIndexParams Source #
data FlannSearchParams Source #