vidformer 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
vidformer/__init__.py
CHANGED
vidformer/cv2/vf_cv2.py
CHANGED
@@ -46,6 +46,9 @@ LINE_8 = 8
|
|
46
46
|
LINE_AA = 16
|
47
47
|
|
48
48
|
_inline_mat = vf.Filter("_inline_mat")
|
49
|
+
_slice_mat = vf.Filter("_slice_mat")
|
50
|
+
_slice_write_mat = vf.Filter("_slice_write_mat")
|
51
|
+
|
49
52
|
|
50
53
|
_filter_scale = vf.Filter("Scale")
|
51
54
|
_filter_rectangle = vf.Filter("cv2.rectangle")
|
@@ -119,6 +122,92 @@ class Frame:
|
|
119
122
|
frame = frame[:, :, ::-1] # convert RGB to BGR
|
120
123
|
return frame
|
121
124
|
|
125
|
+
def __getitem__(self, key):
|
126
|
+
if not isinstance(key, tuple):
|
127
|
+
raise NotImplementedError("Only 2D slicing is supported")
|
128
|
+
|
129
|
+
if len(key) != 2:
|
130
|
+
raise NotImplementedError("Only 2D slicing is supported")
|
131
|
+
|
132
|
+
if not all(isinstance(x, slice) for x in key):
|
133
|
+
raise NotImplementedError("Only 2D slicing is supported")
|
134
|
+
|
135
|
+
miny = key[0].start if key[0].start is not None else 0
|
136
|
+
maxy = key[0].stop if key[0].stop is not None else self.shape[0]
|
137
|
+
minx = key[1].start if key[1].start is not None else 0
|
138
|
+
maxx = key[1].stop if key[1].stop is not None else self.shape[1]
|
139
|
+
|
140
|
+
# handle negative indices
|
141
|
+
if miny < 0:
|
142
|
+
miny = self.shape[0] + miny
|
143
|
+
if maxy < 0:
|
144
|
+
maxy = self.shape[0] + maxy
|
145
|
+
if minx < 0:
|
146
|
+
minx = self.shape[1] + minx
|
147
|
+
if maxx < 0:
|
148
|
+
maxx = self.shape[1] + maxx
|
149
|
+
|
150
|
+
if (
|
151
|
+
maxy <= miny
|
152
|
+
or maxx <= minx
|
153
|
+
or miny < 0
|
154
|
+
or minx < 0
|
155
|
+
or maxy > self.shape[0]
|
156
|
+
or maxx > self.shape[1]
|
157
|
+
):
|
158
|
+
raise NotImplementedError("Invalid slice")
|
159
|
+
|
160
|
+
f = _slice_mat(self._f, miny, maxy, minx, maxx)
|
161
|
+
fmt = self._fmt.copy()
|
162
|
+
fmt["width"] = maxx - minx
|
163
|
+
fmt["height"] = maxy - miny
|
164
|
+
return Frame(f, fmt)
|
165
|
+
|
166
|
+
def __setitem__(self, key, value):
|
167
|
+
value = frameify(value, "value")
|
168
|
+
|
169
|
+
if not isinstance(key, tuple):
|
170
|
+
raise NotImplementedError("Only 2D slicing is supported")
|
171
|
+
|
172
|
+
if len(key) != 2:
|
173
|
+
raise NotImplementedError("Only 2D slicing is supported")
|
174
|
+
|
175
|
+
if not all(isinstance(x, slice) for x in key):
|
176
|
+
raise NotImplementedError("Only 2D slicing is supported")
|
177
|
+
|
178
|
+
miny = key[0].start if key[0].start is not None else 0
|
179
|
+
maxy = key[0].stop if key[0].stop is not None else self.shape[0]
|
180
|
+
minx = key[1].start if key[1].start is not None else 0
|
181
|
+
maxx = key[1].stop if key[1].stop is not None else self.shape[1]
|
182
|
+
|
183
|
+
# handle negative indices
|
184
|
+
if miny < 0:
|
185
|
+
miny = self.shape[0] + miny
|
186
|
+
if maxy < 0:
|
187
|
+
maxy = self.shape[0] + maxy
|
188
|
+
if minx < 0:
|
189
|
+
minx = self.shape[1] + minx
|
190
|
+
if maxx < 0:
|
191
|
+
maxx = self.shape[1] + maxx
|
192
|
+
|
193
|
+
if (
|
194
|
+
maxy <= miny
|
195
|
+
or maxx <= minx
|
196
|
+
or miny < 0
|
197
|
+
or minx < 0
|
198
|
+
or maxy > self.shape[0]
|
199
|
+
or maxx > self.shape[1]
|
200
|
+
):
|
201
|
+
raise NotImplementedError("Invalid slice")
|
202
|
+
|
203
|
+
if value.shape[0] != maxy - miny or value.shape[1] != maxx - minx:
|
204
|
+
raise NotImplementedError("Shape mismatch")
|
205
|
+
|
206
|
+
self._mut()
|
207
|
+
value._mut()
|
208
|
+
|
209
|
+
self._f = _slice_write_mat(self._f, value._f, miny, maxy, minx, maxx)
|
210
|
+
|
122
211
|
|
123
212
|
def _inline_frame(arr):
|
124
213
|
assert arr.dtype == np.uint8
|
@@ -137,20 +226,6 @@ def _inline_frame(arr):
|
|
137
226
|
return Frame(f, fmt)
|
138
227
|
|
139
228
|
|
140
|
-
def _framify(obj, field_name=None):
|
141
|
-
if isinstance(obj, Frame):
|
142
|
-
return obj
|
143
|
-
elif isinstance(obj, np.ndarray):
|
144
|
-
return _inline_frame(obj)
|
145
|
-
else:
|
146
|
-
if field_name is not None:
|
147
|
-
raise Exception(
|
148
|
-
f"Unsupported type for field {field_name}, expected Frame or np.ndarray"
|
149
|
-
)
|
150
|
-
else:
|
151
|
-
raise Exception("Unsupported type, expected Frame or np.ndarray")
|
152
|
-
|
153
|
-
|
154
229
|
class VideoCapture:
|
155
230
|
def __init__(self, path):
|
156
231
|
self._path = path
|
@@ -213,7 +288,7 @@ class VideoWriter:
|
|
213
288
|
self._pix_fmt = "yuv420p"
|
214
289
|
|
215
290
|
def write(self, frame):
|
216
|
-
frame =
|
291
|
+
frame = frameify(frame, "frame")
|
217
292
|
|
218
293
|
if frame._fmt["pix_fmt"] != self._pix_fmt:
|
219
294
|
f_obj = _filter_scale(frame._f, pix_fmt=self._pix_fmt)
|
@@ -245,6 +320,24 @@ class VideoWriter_fourcc:
|
|
245
320
|
self._args = args
|
246
321
|
|
247
322
|
|
323
|
+
def frameify(obj, field_name=None):
|
324
|
+
"""
|
325
|
+
Turn an object (e.g., ndarray) into a Frame.
|
326
|
+
"""
|
327
|
+
|
328
|
+
if isinstance(obj, Frame):
|
329
|
+
return obj
|
330
|
+
elif isinstance(obj, np.ndarray):
|
331
|
+
return _inline_frame(obj)
|
332
|
+
else:
|
333
|
+
if field_name is not None:
|
334
|
+
raise Exception(
|
335
|
+
f"Unsupported type for field {field_name}, expected Frame or np.ndarray"
|
336
|
+
)
|
337
|
+
else:
|
338
|
+
raise Exception("Unsupported type, expected Frame or np.ndarray")
|
339
|
+
|
340
|
+
|
248
341
|
def imread(path, *args):
|
249
342
|
if len(args) > 0:
|
250
343
|
raise NotImplementedError("imread does not support additional arguments")
|
@@ -260,7 +353,7 @@ def imwrite(path, img, *args):
|
|
260
353
|
if len(args) > 0:
|
261
354
|
raise NotImplementedError("imwrite does not support additional arguments")
|
262
355
|
|
263
|
-
img =
|
356
|
+
img = frameify(img)
|
264
357
|
|
265
358
|
fmt = img._fmt.copy()
|
266
359
|
width = fmt["width"]
|
@@ -316,7 +409,7 @@ def rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):
|
|
316
409
|
cv.rectangle( img, pt1, pt2, color[, thickness[, lineType[, shift]]] )
|
317
410
|
"""
|
318
411
|
|
319
|
-
img =
|
412
|
+
img = frameify(img)
|
320
413
|
img._mut()
|
321
414
|
|
322
415
|
assert len(pt1) == 2
|
@@ -360,7 +453,7 @@ def putText(
|
|
360
453
|
cv.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]] )
|
361
454
|
"""
|
362
455
|
|
363
|
-
img =
|
456
|
+
img = frameify(img)
|
364
457
|
img._mut()
|
365
458
|
|
366
459
|
assert isinstance(text, str)
|
@@ -399,7 +492,7 @@ def arrowedLine(
|
|
399
492
|
"""
|
400
493
|
cv.arrowedLine( img, pt1, pt2, color[, thickness[, line_type[, shift[, tipLength]]]] )
|
401
494
|
"""
|
402
|
-
img =
|
495
|
+
img = frameify(img)
|
403
496
|
img._mut()
|
404
497
|
|
405
498
|
assert len(pt1) == 2
|
@@ -433,7 +526,7 @@ def arrowedLine(
|
|
433
526
|
|
434
527
|
|
435
528
|
def line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):
|
436
|
-
img =
|
529
|
+
img = frameify(img)
|
437
530
|
img._mut()
|
438
531
|
|
439
532
|
assert len(pt1) == 2
|
@@ -463,7 +556,7 @@ def line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None):
|
|
463
556
|
|
464
557
|
|
465
558
|
def circle(img, center, radius, color, thickness=None, lineType=None, shift=None):
|
466
|
-
img =
|
559
|
+
img = frameify(img)
|
467
560
|
img._mut()
|
468
561
|
|
469
562
|
assert len(center) == 2
|
@@ -514,8 +607,8 @@ def addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=-1):
|
|
514
607
|
"""
|
515
608
|
cv.addWeighted( src1, alpha, src2, beta, gamma[, dst[, dtype]] ) -> dst
|
516
609
|
"""
|
517
|
-
src1 =
|
518
|
-
src2 =
|
610
|
+
src1 = frameify(src1, "src1")
|
611
|
+
src2 = frameify(src2, "src2")
|
519
612
|
src1._mut()
|
520
613
|
src2._mut()
|
521
614
|
|
@@ -0,0 +1,7 @@
|
|
1
|
+
vidformer/__init__.py,sha256=scMlj2LLMBZXdv9ob_Dhb4ObK7RZLzxVgELyaR650xU,113
|
2
|
+
vidformer/vf.py,sha256=GjgaKnbk3o75lwrXP3Ue0LDyTxSf-l0njL5X-6QYZvs,31496
|
3
|
+
vidformer/cv2/__init__.py,sha256=wOjDsYyUKlP_Hye8-tyz-msu9xwaPMpN2sGMu3Lh3-w,22
|
4
|
+
vidformer/cv2/vf_cv2.py,sha256=8shv614pmNHQyHMqjJSZf08j3eNxE_XtfdLd_kyh5no,19396
|
5
|
+
vidformer-0.8.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
6
|
+
vidformer-0.8.0.dist-info/METADATA,sha256=aXFYRxtNx4hfWlqW7Zx_RW-X2CuN3-adYwRrCUkLtI4,1487
|
7
|
+
vidformer-0.8.0.dist-info/RECORD,,
|
vidformer-0.7.0.dist-info/RECORD
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
vidformer/__init__.py,sha256=uCe1BJKzIv5LzLK4TZLlOtw6ru8vCUsf7vJkov5-oCE,113
|
2
|
-
vidformer/vf.py,sha256=GjgaKnbk3o75lwrXP3Ue0LDyTxSf-l0njL5X-6QYZvs,31496
|
3
|
-
vidformer/cv2/__init__.py,sha256=wOjDsYyUKlP_Hye8-tyz-msu9xwaPMpN2sGMu3Lh3-w,22
|
4
|
-
vidformer/cv2/vf_cv2.py,sha256=Rta6wCIVaOAnkGXlpqE06qVjFmnn9FnuP7LUD9xrRHU,16413
|
5
|
-
vidformer-0.7.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
6
|
-
vidformer-0.7.0.dist-info/METADATA,sha256=4YKlG7kViJIWONuWeJEkxdIy2iZg4wZJ4NWzaPWATBw,1487
|
7
|
-
vidformer-0.7.0.dist-info/RECORD,,
|
File without changes
|