14
14
from natsort import natsorted
15
15
16
16
from napari_deeplabcut import misc
17
+ from napari_video .napari_video import VideoReaderNP
17
18
18
19
SUPPORTED_IMAGES = ".jpg" , ".jpeg" , ".png"
19
20
SUPPORTED_VIDEOS = ".mp4" , ".mov" , ".avi"
@@ -231,56 +232,9 @@ def read_hdf(filename: str) -> List[LayerData]:
231
232
return layers
232
233
233
234
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
-
274
235
def read_video (filename : str , opencv : bool = True ):
275
236
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 )
284
238
else : # pragma: no cover
285
239
from pims import PyAVReaderIndexed
286
240
@@ -292,12 +246,12 @@ def _read_frame(ind):
292
246
shape = stream .frame_shape
293
247
lazy_imread = delayed (stream .get_frame )
294
248
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
+ )
301
255
elems = list (Path (filename ).parts )
302
256
elems [- 2 ] = "labeled-data"
303
257
elems [- 1 ] = elems [- 1 ].split ("." )[0 ]
0 commit comments