1414from natsort import natsorted
1515
1616from napari_deeplabcut import misc
17+ from napari_video .napari_video import VideoReaderNP
1718
1819SUPPORTED_IMAGES = ".jpg" , ".jpeg" , ".png"
1920SUPPORTED_VIDEOS = ".mp4" , ".mov" , ".avi"
@@ -231,56 +232,9 @@ def read_hdf(filename: str) -> List[LayerData]:
231232 return layers
232233
233234
234- class Video :
235- def __init__ (self , video_path ):
236- if not os .path .isfile (video_path ):
237- raise ValueError (f'Video path "{ video_path } " does not point to a file.' )
238-
239- self .path = video_path
240- self .stream = cv2 .VideoCapture (video_path )
241- if not self .stream .isOpened ():
242- raise OSError ("Video could not be opened." )
243-
244- self ._n_frames = int (self .stream .get (cv2 .CAP_PROP_FRAME_COUNT ))
245- self ._width = int (self .stream .get (cv2 .CAP_PROP_FRAME_WIDTH ))
246- self ._height = int (self .stream .get (cv2 .CAP_PROP_FRAME_HEIGHT ))
247- self ._frame = cv2 .UMat (self ._height , self ._width , cv2 .CV_8UC3 )
248-
249- def __len__ (self ):
250- return self ._n_frames
251-
252- @property
253- def width (self ):
254- return self ._width
255-
256- @property
257- def height (self ):
258- return self ._height
259-
260- def set_to_frame (self , ind ):
261- ind = min (ind , len (self ) - 1 )
262- ind += 1 # Unclear why this is needed at all
263- self .stream .set (cv2 .CAP_PROP_POS_FRAMES , ind )
264-
265- def read_frame (self ):
266- self .stream .retrieve (self ._frame )
267- cv2 .cvtColor (self ._frame , cv2 .COLOR_BGR2RGB , self ._frame , 3 )
268- return self ._frame .get ()
269-
270- def close (self ):
271- self .stream .release ()
272-
273-
274235def read_video (filename : str , opencv : bool = True ):
275236 if opencv :
276- stream = Video (filename )
277- shape = stream .width , stream .height , 3
278-
279- def _read_frame (ind ):
280- stream .set_to_frame (ind )
281- return stream .read_frame ()
282-
283- lazy_imread = delayed (_read_frame )
237+ movie = VideoReaderNP (filename )
284238 else : # pragma: no cover
285239 from pims import PyAVReaderIndexed
286240
@@ -292,12 +246,12 @@ def _read_frame(ind):
292246 shape = stream .frame_shape
293247 lazy_imread = delayed (stream .get_frame )
294248
295- movie = da .stack (
296- [
297- da .from_delayed (lazy_imread (i ), shape = shape , dtype = np .uint8 )
298- for i in range (len (stream ))
299- ]
300- )
249+ movie = da .stack (
250+ [
251+ da .from_delayed (lazy_imread (i ), shape = shape , dtype = np .uint8 )
252+ for i in range (len (stream ))
253+ ]
254+ )
301255 elems = list (Path (filename ).parts )
302256 elems [- 2 ] = "labeled-data"
303257 elems [- 1 ] = elems [- 1 ].split ("." )[0 ]
0 commit comments