
    uki*%                        d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddl	Z	ddl
ZddlmZ ddlmZ ddlmZ ddlmZ d	Zd
ZdZddgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gd.d/gd0d1gd2d3gd4d5ggd6d7gd8dgd9d:gd;d<gd=d>gd?d@gdAd6gdBdCgdDdEgdFdGgdHdIgdJdKgdLdMgd6dNgdOdPgdQdRgdSdTgdUdVgdWdXgdYdQgdZd[gggZ G d\ d]ej2                        Zed^k(  r ej8                          yy)_z+Tests for mediapipe.python.solutions.hands.    N)
NamedTuple)absltest)parameterized)drawing_styles)drawing_utils)handsz#mediapipe/python/solutions/testdata      iD  "   i  2   i  ^   i     i     i     i     i  i$  i  iJ  i!     i  i	  i  i?  i  ih  iE     iK     iQ  i0  iW  iZ  ig     it     i~  i  i  i      iW     i  i  i!     iB                 Z      3            s      <                  |   M   u   $   j      \      O   D   ]   c                       e Zd Zd Zd Zd Zd Zdej                  de	de
fdZd	 Zd
 Z ej                  dddd      d        Z	 	 	 ddZ ej                  d      d        Zy)	HandsTestc                     t         j                  j                  t        j                         | j                         j                  d      d   |z         S )N.)ospathjointempfile
gettempdiridsplit)selfnames     `/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/mediapipe/python/solutions/hands_test.py_get_output_pathzHandsTest._get_output_path8   s9    77<<++-twwys/CB/G$/NOO    c           	          |\  }}}t        j                  |j                  D cg c].  }|j                  |z  |j                  |z  |j
                  |z  f0 c}      S c c}w Nnpasarraylandmarkxyz)rD   landmark_listimage_shaperowscols_lmks          rF   _landmarks_list_to_arrayz"HandsTest._landmarks_list_to_array;   s^    MD$::"/"8"8: ceedlCEEDLA : ; ; :s   3Ac                     t        j                  |j                  D cg c]%  }|j                  |j                  |j
                  f' c}      S c c}w rJ   rK   )rD   rR   rW   s      rF   _world_landmarks_list_to_arrayz(HandsTest._world_landmarks_list_to_array@   sG    ::"/"8"8: suucee, : ; ; :s   *Ac                 \    t        j                  t        j                  ||z
        |       y rJ   )nptassert_array_lessrL   abs)rD   array1array2	thresholds       rF   _assert_diff_lesszHandsTest._assert_diff_lessD   s    "&&&19=rH   frameresultsidxc           	         |j                   D ]M  }t        j                  ||t        j                  t        j                         t        j                                O t        j                  j                  t        j                         | j                         j                  d      d   dj                  |      z         }t!        j"                  ||       y )Nr;   r<   z_frame_{}.png)multi_hand_landmarks
mp_drawingdraw_landmarksmp_handsHAND_CONNECTIONSr    get_default_hand_landmarks_style"get_default_hand_connections_styler=   r>   r?   r@   rA   rB   rC   formatcv2imwrite)rD   rc   rd   re   hand_landmarksr>   s         rF   	_annotatezHandsTest._annotateG   s    !66 ?
!:!:

9
9
;

;
;
=??
 77<<++-twwys/CB/G.=.D.DS.I0J KDKKerH   c           	      6   t        j                         5 }| j                  t        d      5  |j	                  t        j                  dt
        j                        j                  ddd             d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nz0Input image must contain three channel rgb data.r0   dtype      )	rj   HandsassertRaisesRegex
ValueErrorprocessrL   arangeuint8reshape)rD   r   s     rF   test_invalid_image_shapez"HandsTest.test_invalid_image_shapeQ   s    		 FU!!
HJ Fbii"((3;;Aq!DEFF FF FF Fs#   BAB2BB	BBc                 T   t        j                         5 }t        j                  g dt        j                        }|j                  d       |j                  |      }| j                  |j                         | j                  |j                         d d d        y # 1 sw Y   y xY w)N)d   r   rv   rt      )
rj   rx   rL   zerosr}   fillr{   assertIsNonerg   multi_handedness)rD   r   imagerd   s       rF   test_blank_imagezHandsTest.test_blank_imageW   sx    		 2Uhh}BHH5ejjoe$g
445
0012 2 2s   B BB')!static_image_mode_with_lite_modelTr      )video_mode_with_lite_modelFr   
   )!static_image_mode_with_full_modelT   r   )video_mode_with_full_modelFr   r   c                    t         j                  j                  t         j                  j                  t              d      }t        j                  |      }t        j                  |d|d      5 }t        |      D ]  }|j                  t        j                  |t
        j                              }| j                  |j                         ||       |j                  D 	cg c]  }	|	j                   d   j"                   c}	}	g }
|j$                  \  }}}|j&                  D ]  }| j)                  |j*                  d       |j*                  D cg c]  }|j,                  |z   }}|j*                  D cg c]  }|j.                  |z   }}t1        j2                  ||f      }|
j5                  |        | j)                  |	d       | j)                  |
d       t1        j6                  t1        j8                  |
      t1        j8                  t:              z
        }|dk(  rt<        nt>        }tA        jB                  ||        	 d d d        y c c}	w c c}w c c}w # 1 sw Y   y xY w)Nztestdata/hands.jpg         ?static_image_modemax_num_handsmodel_complexitymin_detection_confidencer      )"r=   r>   r?   dirname__file__ro   imreadrj   rx   ranger{   cvtColorCOLOR_BGR2RGBrr   copyr   classificationlabelshaperg   	assertLenrN   rO   rP   rL   column_stackappendr^   rM   $EXPECTED_HAND_COORDINATES_PREDICTIONLITE_MODEL_DIFF_THRESHOLDFULL_MODEL_DIFF_THRESHOLDr\   r]   )rD   r   r   
num_frames
image_pathr   r   re   rd   
handednessmulti_hand_coordinatesrT   rU   rV   	landmarksrN   rO   rP   hand_coordinatesprediction_errordiff_thresholds                        rF   test_multi_handszHandsTest.test_multi_hands_   s    bggooh79MNJJJz"E	+)!$	
& @ */z" @#--UC4E4E FGuzz|Wc2 &66
 %%a(..

 "$dA 55 	:I
..++R
01:1C1CDXxzzD D!D1:1C1CDXxzzD D!D__aV4

 
'
'(8
9	: 	z1%-q166JJ-.JJ;<=> 7G!6K2Qj.?+@@ @
 ED#@ @s9   0A2I!" IAI!I
&I!6I
B<I!I!!I*c                    t        j                  |      }g }g }t        j                  d||d      5 }		 |j	                         \  }
}|
sn7t        j
                  |t         j                        }|j                  }|	j                  |      }t        j                  |||g      t        j                  z  }t        j                  |||g      t        j                  z  }|j                  r4t        |j                        D ]  \  }}| j                  ||      }|||<    |j                  r3t        |j                        D ]  \  }}| j!                  |      }|||<    |j#                  |       |j#                  |       N	 d d d        t        j$                  |      t        j$                  |      fS # 1 sw Y   3xY w)NFr   r   )r   )ro   VideoCapturerj   rx   readr   r   r   r{   rL   r   nanrg   	enumeraterX   multi_hand_world_landmarksrZ   r   array)rD   r   
video_pathr   num_landmarksnum_dimensions	video_caplandmarks_per_framew_landmarks_per_framer   successinput_frameframe_shaperesultframe_landmarksframe_w_landmarksre   r   w_landmarkss                      rF   _process_videozHandsTest._process_video   s   
   ,I	#)!$	
& 8 */(~~/
 ll;0A0AB!''[1((M$1>$C DFHffMHHm&3^&E FHJO && )&*E*E F -nc955iMI#,OC - ,,"+F,M,M"N 1c;==kJK%0c"1 	""?3$$%673  8> HH()2884I+JKK?8 8s   EF66F?)fullr   zasl_hand.full.npzc                    d}d}t         j                  j                  t         j                  j                  t              d      }t         j                  j                  t         j                  j                  t              dj                  |            }| j                  ||      \  }}| j                  |      }	t        j                  |	||       | j                  |j                  dd            }
t        |
d      5 }t        j                  |d	      j                         t        j                  |d	      j                         d
}|j                  t        j                   |dd             ddd       t        j"                  |      d   }|j$                  |j$                  k(  s+J dj                  |j$                  |j$                               | j'                  |dddf   |dddf   |       t        j"                  |      d   }|j$                  |j$                  k(  s+J dj                  |j$                  |j$                               | j'                  |||       y# 1 sw Y   xY w)zTests hand models on a video.   g?ztestdata/asl_hand.25fps.mp4ztestdata/{})predictionsw_predictionsz.npzz.jsonwrv   )r   predictions_worldr   ),z: )indent
separatorsNr   z1Unexpected shape of predictions: {} instead of {}.)ra   r   z7Unexpected shape of world predictions: {} instead of {})r=   r>   r?   r   r   rn   r   rG   rL   savezreplaceopenaroundtolistwritejsondumpsloadr   rb   )rD   r   expected_namer   world_diff_thresholdr   expected_pathactualactual_worldnpz_path	json_pathfl	dump_dataexpectedexpected_worlds                  rF   test_on_videozHandsTest.test_on_video   s'    Nbggooh7;=JGGLL!:!.!5!5m!DFM../?LFL $$]3HHHX6F %%m&;&;FG&LMI	i	 H61-446!yyq9@@Bi 	hhtzz)A+FGH ww}%m4H<<8>>) +;BBLL(..	*+) 	sBQBw#rr'*n  F WW]+O<N!5!55 7AHH 4 4	675 	n0D  F)H Hs   A1I))I2N)r   r   rv   )__name__
__module____qualname__rG   rX   rZ   rb   rL   ndarrayr   intrr   r   r   r   named_parametersr   r   r    rH   rF   r9   r9   6   s    P;
;>RZZ * 3 F2 "=!!7272	4
@4
@@ $%#%$%'LR "=!!&((F((FrH   r9   __main__)__doc__r   r=   r@   typingr   absl.testingr   r   ro   numpyrL   numpy.testingtestingr\   mediapipe.python.solutionsr   r   rh   r   rj   TEST_IMAGE_PATHr   r   r   TestCaser9   r   mainr   rH   rF   <module>r      s   2  	   ! & 
   6 B 8 8  *-rS"IRy*-sc3Z#s*-sc3Z#s*-sc3Z#s*-sc3Z#s*-sc3Z#s*-sc3Z#s)M +.sc3Z#s*-sc3Z#s*-sc2Yb	*-sc3Z#r*-rS#Jc
*-rS"ISz*,cRIBx)I(J $ `F&& `FF z(--/ rH   