o
    ^i\3                     @   s   d dl ZddlmZmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ ed
Zg dZeddD ]Zeeee  eee d D ]Zdede de f< qTqBG dd deeZdS )    N   )FeatureDetectorDescriptorExtractor_mask_border_keypoints_prepare_grayscale_input_2D   )corner_fastcorner_orientationscorner_peakscorner_harris)pyramid_gaussian)check_nD)NP_COPY_IF_NEEDED)	_orb_loop)   r   )   r   r   r      r   r      r         
   	            i   r   c                   @   sV   e Zd ZdZ						ddd	Zd
d Zdd Zdd Zdd Zdd Z	dd Z
dS )ORBa  Oriented FAST and rotated BRIEF feature detector and binary descriptor
    extractor.

    Parameters
    ----------
    n_keypoints : int, optional
        Number of keypoints to be returned. The function will return the best
        `n_keypoints` according to the Harris corner response if more than
        `n_keypoints` are detected. If not, then all the detected keypoints
        are returned.
    fast_n : int, optional
        The `n` parameter in `skimage.feature.corner_fast`. Minimum number of
        consecutive pixels out of 16 pixels on the circle that should all be
        either brighter or darker w.r.t test-pixel. A point c on the circle is
        darker w.r.t test pixel p if ``Ic < Ip - threshold`` and brighter if
        ``Ic > Ip + threshold``. Also stands for the n in ``FAST-n`` corner
        detector.
    fast_threshold : float, optional
        The ``threshold`` parameter in ``feature.corner_fast``. Threshold used
        to decide whether the pixels on the circle are brighter, darker or
        similar w.r.t. the test pixel. Decrease the threshold when more
        corners are desired and vice-versa.
    harris_k : float, optional
        The `k` parameter in `skimage.feature.corner_harris`. Sensitivity
        factor to separate corners from edges, typically in range ``[0, 0.2]``.
        Small values of `k` result in detection of sharp corners.
    downscale : float, optional
        Downscale factor for the image pyramid. Default value 1.2 is chosen so
        that there are more dense scales which enable robust scale invariance
        for a subsequent feature description.
    n_scales : int, optional
        Maximum number of scales from the bottom of the image pyramid to
        extract the features from.

    Attributes
    ----------
    keypoints : (N, 2) array
        Keypoint coordinates as ``(row, col)``.
    scales : (N,) array
        Corresponding scales.
    orientations : (N,) array
        Corresponding orientations in radians.
    responses : (N,) array
        Corresponding Harris corner responses.
    descriptors : (Q, `descriptor_size`) array of dtype bool
        2D array of binary descriptors of size `descriptor_size` for Q
        keypoints after filtering out border keypoints with value at an
        index ``(i, j)`` either being ``True`` or ``False`` representing
        the outcome of the intensity comparison for i-th keypoint on j-th
        decision pixel-pair. It is ``Q == np.sum(mask)``.

    References
    ----------
    .. [1] Ethan Rublee, Vincent Rabaud, Kurt Konolige and Gary Bradski
          "ORB: An efficient alternative to SIFT and SURF"
          http://www.vision.cs.chubu.ac.jp/CV-R/pdf/Rublee_iccv2011.pdf

    Examples
    --------
    >>> from skimage.feature import ORB, match_descriptors
    >>> img1 = np.zeros((100, 100))
    >>> img2 = np.zeros_like(img1)
    >>> rng = np.random.default_rng(19481137)  # do not copy this value
    >>> square = rng.random((20, 20))
    >>> img1[40:60, 40:60] = square
    >>> img2[53:73, 53:73] = square
    >>> detector_extractor1 = ORB(n_keypoints=5)
    >>> detector_extractor2 = ORB(n_keypoints=5)
    >>> detector_extractor1.detect_and_extract(img1)
    >>> detector_extractor2.detect_and_extract(img2)
    >>> matches = match_descriptors(detector_extractor1.descriptors,
    ...                             detector_extractor2.descriptors)
    >>> matches
    array([[0, 0],
           [1, 1],
           [2, 2],
           [3, 4],
           [4, 3]])
    >>> detector_extractor1.keypoints[matches[:, 0]]
    array([[59. , 59. ],
           [40. , 40. ],
           [57. , 40. ],
           [46. , 58. ],
           [58.8, 58.8]])
    >>> detector_extractor2.keypoints[matches[:, 1]]
    array([[72., 72.],
           [53., 53.],
           [70., 53.],
           [59., 71.],
           [72., 72.]])

    333333?r     r   {Gz?{Gz?c                 C   sF   || _ || _|| _|| _|| _|| _d | _d | _d | _d | _	d | _
d S )N)	downscalen_scalesn_keypointsfast_nfast_thresholdharris_k	keypointsscales	responsesorientationsdescriptors)selfr!   r"   r#   r$   r%   r&    r-   N/var/www/html/RAG/RAG_venv/lib/python3.10/site-packages/skimage/feature/orb.py__init__w   s   	
zORB.__init__c                 C   s$   t |}tt|| jd | jd dS )Nr   )channel_axis)r   listr   r"   r!   )r,   imager-   r-   r.   _build_pyramid   s   zORB._build_pyramidc           	      C   s   |j }t|| j| j}t|dd}t|dkr+tjd|dtjd|dtjd|dfS t|j	|dd}|| }t
||t}t|d	| jd
}||d d df |d d df f }|||fS )Nr   )min_distancer   )r   r   dtype)r   r   distancek)methodr9   )r6   r   r$   r%   r
   lennpzerosr   shaper	   
OFAST_MASKr   r&   )	r,   octave_imager6   fast_responser'   maskr*   harris_responser)   r-   r-   r.   _detect_octave   s   $
zORB._detect_octavec                 C   sP  t |d | |}g }g }g }g }tt|D ]A}t|| }t|jdk r+ n/| |\}	}
}|	|	| j
|   |	|
 |	tj|	jd | j
| |jd |	| qt|}	t|}
t|}t|}|	jd | jk r|	| _|| _|
| _|| _dS | ddd d| j }|	| | _|| | _|
| | _|| | _dS )zDetect oriented FAST keypoints along with the corresponding scale.

        Parameters
        ----------
        image : 2D array
            Input image.

        r   r   r5   N)r   r3   ranger;   r<   ascontiguousarraysqueezendimrD   appendr!   fullr>   r6   vstackhstackr#   r'   r(   r*   r)   argsort)r,   r2   pyramidkeypoints_listorientations_listscales_listresponses_listoctaver@   r'   r*   r)   r(   best_indicesr-   r-   r.   detect   sF   
	









z
ORB.detectc                 C   sP   t |j|dd}tj|| tjdtd}tj|| ddd}t|||}||fS )N   r7   C)r6   ordercopyF)rY   rZ   )r   r>   r<   arrayintpr   r   )r,   r@   r'   r*   rB   r+   r-   r-   r.   _extract_octave   s   zORB._extract_octavec                 C   s   t |d | |}g }g }t|t| j tj}tt|D ]6}	||	k}
t	|
dkrYt
||	 }||
 }|| j|	  }||
 }| |||\}}|| || q#t|t| _t|| _dS )a  Extract rBRIEF binary descriptors for given keypoints in image.

        Note that the keypoints must be extracted using the same `downscale`
        and `n_scales` parameters. Additionally, if you want to extract both
        keypoints and descriptors you should use the faster
        `detect_and_extract`.

        Parameters
        ----------
        image : 2D array
            Input image.
        keypoints : (N, 2) array
            Keypoint coordinates as ``(row, col)``.
        scales : (N,) array
            Corresponding scales.
        orientations : (N,) array
            Corresponding orientations in radians.

        r   r   N)r   r3   r<   logr!   astyper\   rF   r;   sumrG   r]   rJ   rL   viewboolr+   rM   mask_)r,   r2   r'   r(   r*   rO   descriptors_list	mask_listoctavesrT   octave_maskr@   octave_keypointsoctave_orientationsr+   rB   r-   r-   r.   extract   s(   



zORB.extractc                 C   s  t |d | |}g }g }g }g }g }tt|D ]s}t|| }	t|	jdk r- na| |	\}
}}t|
dkrP|	|
 |	| |	tj
dtd q| |	|
|\}}|
| | j|  }|	| |	||  |	||  |	| j| tj|jd tjd  |	| qt|dkrtdt|}
t|}t|}t|}t|t}|
jd | jk r|
| _|| _|| _|| _|| _dS | ddd d| j }|
| | _|| | _|| | _|| | _|| | _dS )zDetect oriented FAST keypoints and extract rBRIEF descriptors.

        Note that this is faster than first calling `detect` and then
        `extract`.

        Parameters
        ----------
        image : 2D array
            Input image.

        r   r   )r      r5   znORB found no features. Try passing in an image containing greater intensity contrasts between adjacent pixels.NrE   )r   r3   rF   r;   r<   rG   rH   rI   rD   rJ   r=   rb   r]   r!   onesr>   r\   RuntimeErrorrL   rM   ra   r#   r'   r(   r*   r)   r+   rN   )r,   r2   rO   rP   rS   rR   rQ   rd   rT   r@   r'   r*   r)   r+   rB   scaled_keypointsr(   rU   r-   r-   r.   detect_and_extract"  sf   













zORB.detect_and_extractN)r   r   r   r   r   r    )__name__
__module____qualname____doc__r/   r3   rD   rV   r]   rj   ro   r-   r-   r-   r.   r      s    _
83r   )numpyr<   feature.utilr   r   r   r   cornerr   r	   r
   r   	transformr   _shared.utilsr   _shared.compatr   orb_cyr   r=   r?   
OFAST_UMAXrF   iabsjr   r-   r-   r-   r.   <module>   s    
$