homa 0.24__py3-none-any.whl → 0.26__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.
- homa/__init__.py +3 -1
- homa/camera.py +5 -2
- homa/classes/Image.py +19 -0
- homa/classes/Repository.py +16 -8
- homa/classes/Window.py +119 -0
- homa/events.py +26 -56
- homa/helpers/alias.py +7 -3
- homa/helpers/environment.py +5 -1
- homa/helpers/kernel.py +1 -1
- homa/helpers/string.py +16 -0
- homa/main.py +11 -53
- homa/shapes.py +46 -5
- homa/spaces.py +20 -1
- {homa-0.24.dist-info → homa-0.26.dist-info}/METADATA +1 -1
- homa-0.26.dist-info/RECORD +28 -0
- homa-0.24.dist-info/RECORD +0 -25
- {homa-0.24.dist-info → homa-0.26.dist-info}/LICENSE +0 -0
- {homa-0.24.dist-info → homa-0.26.dist-info}/WHEEL +0 -0
- {homa-0.24.dist-info → homa-0.26.dist-info}/top_level.txt +0 -0
homa/__init__.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from .main import *
|
|
2
|
-
from .filters import *
|
|
3
2
|
from .camera import *
|
|
4
3
|
from .orientation import *
|
|
5
4
|
from .spaces import *
|
|
@@ -7,3 +6,6 @@ from .events import *
|
|
|
7
6
|
from .shapes import *
|
|
8
7
|
|
|
9
8
|
from .helpers import *
|
|
9
|
+
|
|
10
|
+
from .classes.Window import Window
|
|
11
|
+
from .classes.Image import Image
|
homa/camera.py
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import cv2
|
|
2
|
-
from .classes.Repository import Repository
|
|
3
2
|
from typing import Iterator
|
|
3
|
+
from .classes.Repository import Repository
|
|
4
|
+
from .classes.Window import Window
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
def camera(delay: int = 10, exit_on: str = "q") -> Iterator[int]:
|
|
8
|
+
cameraWindow = Window(640, 480)
|
|
9
|
+
|
|
7
10
|
pressed_key = None
|
|
8
11
|
capture = cv2.VideoCapture(0)
|
|
9
12
|
frame_number = 0
|
|
10
13
|
while pressed_key != ord(exit_on):
|
|
11
14
|
_, frame = capture.read()
|
|
12
|
-
|
|
15
|
+
cameraWindow.update(frame)
|
|
13
16
|
|
|
14
17
|
frame_number += 1
|
|
15
18
|
yield frame_number
|
homa/classes/Image.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .Window import Window
|
|
2
|
+
from ..helpers.string import randomLowercaseString
|
|
3
|
+
import cv2
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Image(Window):
|
|
7
|
+
def __init__(self, filename: str | Window):
|
|
8
|
+
if isinstance(filename, Window):
|
|
9
|
+
image = filename.getImage()
|
|
10
|
+
title = f"{filename.getTitle()} Cloned"
|
|
11
|
+
|
|
12
|
+
elif isinstance(filename, str):
|
|
13
|
+
image = cv2.imread(filename)
|
|
14
|
+
title = filename
|
|
15
|
+
|
|
16
|
+
super().__init__(
|
|
17
|
+
image=image,
|
|
18
|
+
title=title
|
|
19
|
+
)
|
homa/classes/Repository.py
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
|
-
from ..helpers.environment import
|
|
1
|
+
from ..helpers.environment import isColab
|
|
2
|
+
from ..helpers.string import randomLowercaseString
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
class RepositoryWrapper:
|
|
5
6
|
def __init__(self):
|
|
6
|
-
self.sigmaX = 0
|
|
7
|
-
self.sigmaY = 0
|
|
8
|
-
|
|
9
7
|
self.directory = "./"
|
|
10
|
-
self.images = {}
|
|
11
|
-
self.windows = {}
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
self.settings = {
|
|
10
|
+
"thickness": 2,
|
|
11
|
+
"color": (0, 0, 0),
|
|
12
|
+
"sigma": [0, 0]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if isColab():
|
|
14
16
|
from google.colab.patches import cv2_imshow as imshow
|
|
15
17
|
else:
|
|
16
18
|
from cv2 import imshow
|
|
17
19
|
|
|
18
20
|
def final_imshow(window, image):
|
|
19
|
-
if
|
|
21
|
+
if isColab():
|
|
20
22
|
imshow(image)
|
|
21
23
|
else:
|
|
22
24
|
imshow(window, image)
|
|
23
25
|
|
|
24
26
|
self.imshow = final_imshow
|
|
25
27
|
|
|
28
|
+
def addImageWithRandomKey(self, image):
|
|
29
|
+
self.addImage(randomLowercaseString(), image)
|
|
30
|
+
|
|
31
|
+
def addImage(self, key, image):
|
|
32
|
+
Repository.images[key] = image
|
|
33
|
+
|
|
26
34
|
|
|
27
35
|
Repository = RepositoryWrapper()
|
homa/classes/Window.py
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import numpy
|
|
2
|
+
import cv2
|
|
3
|
+
|
|
4
|
+
from ..helpers.kernel import createKernel
|
|
5
|
+
from ..helpers.string import randomLowercaseString
|
|
6
|
+
from ..helpers.environment import isNotColab
|
|
7
|
+
|
|
8
|
+
from ..classes.Repository import Repository
|
|
9
|
+
|
|
10
|
+
from ..events import createMouseCallback
|
|
11
|
+
|
|
12
|
+
from typing_extensions import Self
|
|
13
|
+
from typing import List
|
|
14
|
+
|
|
15
|
+
from ..shapes import color
|
|
16
|
+
from ..shapes import stroke
|
|
17
|
+
|
|
18
|
+
from ..main import setting
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Window:
|
|
22
|
+
def __init__(self, width: int = 300, height: int = 300, image=None, title: str | None = None, channels: int = 3, dtype="uint8") -> None:
|
|
23
|
+
if title is None:
|
|
24
|
+
title = randomLowercaseString(10)
|
|
25
|
+
|
|
26
|
+
if image is None:
|
|
27
|
+
image = numpy.zeros([height, width, channels], dtype=dtype)
|
|
28
|
+
|
|
29
|
+
self.__title = title
|
|
30
|
+
self.__image = image
|
|
31
|
+
self.__events = {}
|
|
32
|
+
|
|
33
|
+
def show(self):
|
|
34
|
+
if isNotColab():
|
|
35
|
+
cv2.namedWindow(self.__title)
|
|
36
|
+
cv2.setMouseCallback(
|
|
37
|
+
self.__title, createMouseCallback(self.__events))
|
|
38
|
+
|
|
39
|
+
Repository.imshow(self.__title, self.__image)
|
|
40
|
+
|
|
41
|
+
def title(self, newTitle: str) -> Self:
|
|
42
|
+
self.__title = newTitle
|
|
43
|
+
return self
|
|
44
|
+
|
|
45
|
+
def update(self, newImage) -> Self:
|
|
46
|
+
self.__image = newImage
|
|
47
|
+
self.refresh()
|
|
48
|
+
return self
|
|
49
|
+
|
|
50
|
+
def click(self, handler: callable) -> Self:
|
|
51
|
+
self.__events["click"] = (handler, self)
|
|
52
|
+
return self
|
|
53
|
+
|
|
54
|
+
def move(self, handler: callable) -> Self:
|
|
55
|
+
self.__events["mousemove"] = (handler, self)
|
|
56
|
+
return self
|
|
57
|
+
|
|
58
|
+
def white(self) -> Self:
|
|
59
|
+
self.__image = numpy.ones([
|
|
60
|
+
self.__image.shape[0],
|
|
61
|
+
self.__image.shape[1],
|
|
62
|
+
self.__image.shape[2]
|
|
63
|
+
]) * (2 ** 8 - 1)
|
|
64
|
+
return self
|
|
65
|
+
|
|
66
|
+
def blur(self, kernel: int | List[int] = (7, 7)) -> Self:
|
|
67
|
+
self.update(cv2.blur(
|
|
68
|
+
self.__image,
|
|
69
|
+
createKernel(kernel),
|
|
70
|
+
))
|
|
71
|
+
|
|
72
|
+
return self
|
|
73
|
+
|
|
74
|
+
def gaussian(self, kernel: int | List[int] = (7, 7)) -> Self:
|
|
75
|
+
self.update(cv2.GaussianBlur(
|
|
76
|
+
self.__image,
|
|
77
|
+
createKernel(kernel),
|
|
78
|
+
setting("sigma")[0],
|
|
79
|
+
setting("sigma")[1],
|
|
80
|
+
))
|
|
81
|
+
|
|
82
|
+
return self
|
|
83
|
+
|
|
84
|
+
def median(self, kernel: int) -> Self:
|
|
85
|
+
self.update(cv2.medianBlur(
|
|
86
|
+
self.__image, kernel
|
|
87
|
+
))
|
|
88
|
+
|
|
89
|
+
return self
|
|
90
|
+
|
|
91
|
+
def refresh(self):
|
|
92
|
+
Repository.imshow(self.__title, self.__image)
|
|
93
|
+
|
|
94
|
+
def circle(self, x: int, y: int, radius: int, circleColor: tuple | None = None, thickness: int | None = None):
|
|
95
|
+
if circleColor is not None:
|
|
96
|
+
color(*circleColor)
|
|
97
|
+
|
|
98
|
+
if thickness is not None:
|
|
99
|
+
stroke(thickness)
|
|
100
|
+
|
|
101
|
+
self.update(cv2.circle(
|
|
102
|
+
self.__image,
|
|
103
|
+
(x, y),
|
|
104
|
+
radius,
|
|
105
|
+
setting("color"),
|
|
106
|
+
setting("thickness")
|
|
107
|
+
))
|
|
108
|
+
|
|
109
|
+
def getImage(self):
|
|
110
|
+
return self.__image
|
|
111
|
+
|
|
112
|
+
def getTitle(self):
|
|
113
|
+
return self.__title
|
|
114
|
+
|
|
115
|
+
def __getattr__(self, key):
|
|
116
|
+
if key == "shape":
|
|
117
|
+
return self.__image.shape
|
|
118
|
+
|
|
119
|
+
return None
|
homa/events.py
CHANGED
|
@@ -1,21 +1,6 @@
|
|
|
1
|
-
# enum MouseEventTypes
|
|
2
|
-
# {
|
|
3
|
-
# EVENT_MOUSEMOVE = 0,
|
|
4
|
-
# EVENT_LBUTTONDOWN = 1,
|
|
5
|
-
# EVENT_RBUTTONDOWN = 2,
|
|
6
|
-
# EVENT_MBUTTONDOWN = 3,
|
|
7
|
-
# EVENT_LBUTTONUP = 4,
|
|
8
|
-
# EVENT_RBUTTONUP = 5,
|
|
9
|
-
# EVENT_MBUTTONUP = 6,
|
|
10
|
-
# EVENT_LBUTTONDBLCLK = 7,
|
|
11
|
-
# EVENT_RBUTTONDBLCLK = 8,
|
|
12
|
-
# EVENT_MBUTTONDBLCLK = 9,
|
|
13
|
-
# EVENT_MOUSEWHEEL = 10,
|
|
14
|
-
# EVENT_MOUSEHWHEEL = 11,
|
|
15
|
-
# };
|
|
16
1
|
import cv2
|
|
17
|
-
from .main import win
|
|
18
2
|
from inspect import signature
|
|
3
|
+
from .classes.Repository import Repository
|
|
19
4
|
|
|
20
5
|
event_map = {
|
|
21
6
|
"click": cv2.EVENT_LBUTTONDOWN,
|
|
@@ -25,46 +10,31 @@ event_map = {
|
|
|
25
10
|
"rmouseup": cv2.EVENT_RBUTTONUP,
|
|
26
11
|
"dblclick": cv2.EVENT_LBUTTONDBLCLK,
|
|
27
12
|
"rdblclick": cv2.EVENT_RBUTTONDBLCLK,
|
|
28
|
-
"
|
|
13
|
+
"mousemove": cv2.EVENT_MOUSEMOVE
|
|
29
14
|
}
|
|
30
15
|
|
|
31
16
|
|
|
32
|
-
def
|
|
33
|
-
def
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
handler
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def onMouseUp(key: str, handler: callable):
|
|
59
|
-
win(key)
|
|
60
|
-
cv2.setMouseCallback(key, create_wrapper_function("mouseup", handler))
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def onMove(key: str, handler: callable):
|
|
64
|
-
win(key)
|
|
65
|
-
cv2.setMouseCallback(key, create_wrapper_function("mousemove", handler))
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def onDoubleClick(key: str, handler: callable):
|
|
69
|
-
win(key)
|
|
70
|
-
cv2.setMouseCallback(key, create_wrapper_function("dblclick", handler))
|
|
17
|
+
def createMouseCallback(events: dict):
|
|
18
|
+
def innerMouseCallback(event, x, y, flags, param):
|
|
19
|
+
for e, values in events.items():
|
|
20
|
+
if event != event_map[e]:
|
|
21
|
+
continue
|
|
22
|
+
|
|
23
|
+
handler, context = values
|
|
24
|
+
argumentCount = len(signature(handler).parameters)
|
|
25
|
+
if argumentCount == 2:
|
|
26
|
+
args = (x, y)
|
|
27
|
+
elif argumentCount == 3:
|
|
28
|
+
args = (x, y, context)
|
|
29
|
+
elif argumentCount == 4:
|
|
30
|
+
args = (x, y, context, flags)
|
|
31
|
+
elif argumentCount == 5:
|
|
32
|
+
args = (x, y, context, flags, param)
|
|
33
|
+
elif argumentCount == 1:
|
|
34
|
+
args = (context,)
|
|
35
|
+
elif args == 0:
|
|
36
|
+
args = tuple()
|
|
37
|
+
|
|
38
|
+
handler(*args)
|
|
39
|
+
|
|
40
|
+
return innerMouseCallback
|
homa/helpers/alias.py
CHANGED
|
@@ -3,11 +3,15 @@ from ..classes.Collection import Collection
|
|
|
3
3
|
from typing import List
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
def repo(key: str | None = None):
|
|
7
|
-
if key is None:
|
|
6
|
+
def repo(key: str | None = None, value: any = None) -> any:
|
|
7
|
+
if key is None and value is None:
|
|
8
8
|
return Repository.images
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
if key is not None and value is None:
|
|
11
|
+
return Repository.addImage(key, value)
|
|
12
|
+
|
|
13
|
+
Repository.addImage(key, value)
|
|
14
|
+
return True
|
|
11
15
|
|
|
12
16
|
|
|
13
17
|
def collection(items: List[any]):
|
homa/helpers/environment.py
CHANGED
homa/helpers/kernel.py
CHANGED
homa/helpers/string.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import numpy
|
|
2
|
+
import string
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def randomLowercaseString(length: int = 10):
|
|
6
|
+
return randomString(length, string.ascii_lowercase)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def randomUppercaseString(length: int = 10):
|
|
10
|
+
return randomString(length, string.ascii_uppercase)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def randomString(length: int = 10, letters: str = string.ascii_letters):
|
|
14
|
+
return "".join(
|
|
15
|
+
numpy.random.choice(list(letters), length)
|
|
16
|
+
)
|
homa/main.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import cv2
|
|
2
|
-
from .classes.Logger import Logger
|
|
3
2
|
from .classes.Repository import Repository
|
|
4
3
|
|
|
5
4
|
|
|
@@ -11,36 +10,12 @@ def destroy(key: str | None = None) -> None:
|
|
|
11
10
|
cv2.destroyAllWindows()
|
|
12
11
|
|
|
13
12
|
|
|
14
|
-
def
|
|
15
|
-
|
|
13
|
+
def show(*windows, **settings):
|
|
14
|
+
for window in windows:
|
|
15
|
+
window.show()
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Repository.directory = directory
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def write(key: str, filename: str) -> None:
|
|
23
|
-
cv2.imwrite(
|
|
24
|
-
filename=filename,
|
|
25
|
-
img=Repository.images[key]
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def save(*args, **kwargs) -> None:
|
|
30
|
-
write(args, kwargs)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def image(filename: str, key: str | None = None, color: bool = True) -> None:
|
|
34
|
-
# TODO: add no extension in the file
|
|
35
|
-
if key is None:
|
|
36
|
-
key = filename.split(".")[0]
|
|
37
|
-
|
|
38
|
-
Repository.images[key] = cv2.imread(filename, int(color))
|
|
39
|
-
return Repository.images[key]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def wait(delay=0):
|
|
43
|
-
cv2.waitKey(delay)
|
|
17
|
+
if settings["wait"] == True:
|
|
18
|
+
cv2.waitKey()
|
|
44
19
|
|
|
45
20
|
|
|
46
21
|
def showWait(*args, **kwargs):
|
|
@@ -48,27 +23,10 @@ def showWait(*args, **kwargs):
|
|
|
48
23
|
show(*args, **kwargs)
|
|
49
24
|
|
|
50
25
|
|
|
51
|
-
def
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
Repository.imshow(window, key)
|
|
56
|
-
|
|
57
|
-
elif key is None:
|
|
58
|
-
for key, image in Repository.images.items():
|
|
59
|
-
Repository.imshow(key, image)
|
|
60
|
-
Repository.windows[key] = key
|
|
61
|
-
|
|
62
|
-
elif key is not None:
|
|
63
|
-
if key in Repository.images:
|
|
64
|
-
Repository.imshow(key, Repository.images[key])
|
|
65
|
-
Repository.windows[key] = key
|
|
66
|
-
else:
|
|
67
|
-
Logger.danger(f"No image found with key {key}")
|
|
68
|
-
|
|
69
|
-
if wait:
|
|
70
|
-
cv2.waitKey(0)
|
|
71
|
-
|
|
26
|
+
def setting(key: str, value: any = None) -> any:
|
|
27
|
+
if value is not None:
|
|
28
|
+
Repository.settings[key] = value
|
|
29
|
+
return True
|
|
72
30
|
|
|
73
|
-
|
|
74
|
-
|
|
31
|
+
setting_value = Repository.settings[key]
|
|
32
|
+
return setting_value if setting_value else None
|
homa/shapes.py
CHANGED
|
@@ -1,9 +1,50 @@
|
|
|
1
1
|
import cv2
|
|
2
|
-
from .main import
|
|
2
|
+
from .main import setting
|
|
3
3
|
from .helpers.alias import repo
|
|
4
|
-
from
|
|
4
|
+
from typing import Tuple
|
|
5
|
+
import numpy
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
def
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
def stroke(value: int = 1):
|
|
9
|
+
setting("thickness", value)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def fill(*args):
|
|
13
|
+
setting("thickness", -1)
|
|
14
|
+
|
|
15
|
+
if len(args) == 3:
|
|
16
|
+
color(*args)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def randomColor() -> Tuple[int, int, int]:
|
|
20
|
+
r = numpy.random.randint(0, 255)
|
|
21
|
+
g = numpy.random.randint(0, 255)
|
|
22
|
+
b = numpy.random.randint(0, 255)
|
|
23
|
+
|
|
24
|
+
return (b, g, r)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def color(*args):
|
|
28
|
+
if len(args) == 1 and isinstance(args[0], str) and args[0] in ["random", "rand"]:
|
|
29
|
+
args = randomColor()
|
|
30
|
+
|
|
31
|
+
setting("color", args)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def circle(key: str, x: int, y: int, radius: int = 1):
|
|
35
|
+
cv2.circle(
|
|
36
|
+
repo(key),
|
|
37
|
+
(x, y),
|
|
38
|
+
radius,
|
|
39
|
+
setting("color"),
|
|
40
|
+
setting("thickness")
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def rect(key: str, x: int, y: int, width: int, height: int):
|
|
45
|
+
cv2.rectangle(
|
|
46
|
+
repo(key),
|
|
47
|
+
(x - width // 2, y - height // 2), (x + width // 2, y + height // 2),
|
|
48
|
+
thickness=setting("thickness"),
|
|
49
|
+
color=setting("color")
|
|
50
|
+
)
|
homa/spaces.py
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
from typing import Tuple
|
|
2
2
|
from .helpers.alias import repo
|
|
3
|
+
import cv2
|
|
3
4
|
|
|
4
5
|
|
|
5
|
-
def
|
|
6
|
+
def hsv(key: str):
|
|
7
|
+
image = repo(key)
|
|
8
|
+
cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
|
|
9
|
+
|
|
10
|
+
h = image[:, :, 0]
|
|
11
|
+
s = image[:, :, 1]
|
|
12
|
+
v = image[:, :, 2]
|
|
13
|
+
|
|
14
|
+
return (h, s, v)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def bgr(key: str) -> Tuple[int, int, int]:
|
|
18
|
+
return rgb(key, bgr_flag=True)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def rgb(key: str, bgr_flag: bool = False) -> Tuple[int, int, int]:
|
|
6
22
|
image = repo(key)
|
|
7
23
|
|
|
8
24
|
if image.shape[2] == 3:
|
|
@@ -13,6 +29,9 @@ def rgb(key: str) -> Tuple[int, int, int]:
|
|
|
13
29
|
g = image[:, :, 0]
|
|
14
30
|
r = image[:, :, 0]
|
|
15
31
|
|
|
32
|
+
if bgr_flag:
|
|
33
|
+
return (b, g, r)
|
|
34
|
+
|
|
16
35
|
return (r, g, b)
|
|
17
36
|
|
|
18
37
|
if image.shape[2] == 1:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
homa/__init__.py,sha256=N3G5CLd0gFelUgQzWFj0IGI_8TUMlX8GfyWFp9lrWb0,228
|
|
2
|
+
homa/camera.py,sha256=erui7LWTqZQNBVVxIChw-JCrYchpUjgplgU7d5jSR-E,527
|
|
3
|
+
homa/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
homa/events.py,sha256=WTVUPh0MqRiknA390_vvMSFNhdFeX9iZCrBphGbdTHY,1223
|
|
5
|
+
homa/filters.py,sha256=lEwUZtCUSH59D4J9lWQ-d0ObSk_ikZBGRnNAZWMnpPo,1058
|
|
6
|
+
homa/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
homa/main.py,sha256=jFVKuW1mNS21As7pY4XnXVQ6TaDOHxC2dAmUzE5HG-U,660
|
|
8
|
+
homa/orientation.py,sha256=kR7mEmbjCdyxNeQ7UuGpwTFD6EaNbXmErzaln3gpzfk,804
|
|
9
|
+
homa/shapes.py,sha256=0_THluO4mUg1F4FmP4YQuB5A3W4Ns9Z2tPmhmSyTBlI,1044
|
|
10
|
+
homa/spaces.py,sha256=W2UjzEP54dDgOV4c8xNCu8qJ__j-hwRbnyIOGnwpHwE,804
|
|
11
|
+
homa/classes/Collection.py,sha256=7hskbC8wxTAC3hHmFYXtzR5W05lsA4GaYTzjiez_6Zg,222
|
|
12
|
+
homa/classes/Image.py,sha256=kpIZQjJMUcT9b2V1daX87KFQooAtsHUDR4Fcgk9Qfco,490
|
|
13
|
+
homa/classes/Logger.py,sha256=2VjXJzBLMW5joArFpu2wGrbWUw7S-77z7LNhKUG1Iow,93
|
|
14
|
+
homa/classes/Repository.py,sha256=-E-Ltlr2sudFdr9pN9Bnfib4xkZB6hOCQ_vXGjhzQIc,837
|
|
15
|
+
homa/classes/Window.py,sha256=n_f9RBNl08kuO7sY45VEnbfqmOD3pTANIzlaP-5ou1U,3037
|
|
16
|
+
homa/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
homa/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
homa/helpers/alias.py,sha256=Gv4esGK5SWKbmqvFUAKUfzDqlofdC27ZtndXxfaxE7E,453
|
|
19
|
+
homa/helpers/environment.py,sha256=tGWrgYSu01ezZyqLzWN8I_RkFXgBFgYsvbwQptYQd5w,130
|
|
20
|
+
homa/helpers/kernel.py,sha256=QIbwvx3XzG23TMCj7nUOgSirx3WK_29lkBeVlp2uzQw,329
|
|
21
|
+
homa/helpers/string.py,sha256=nyNcQgZ9l5zf0QwI5gZCMX4dqMWi63VCqtl26ExDZsI,385
|
|
22
|
+
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
tests/test_images.py,sha256=4k5tDcMc2YZOKAq3wNQnbJ_cO1Y_DQ-YUn82yzy__ww,772
|
|
24
|
+
homa-0.26.dist-info/LICENSE,sha256=js3WDbJn9k5EN6sy1uuP2QBXxyPgS5DjO4Bf5yE35hQ,1072
|
|
25
|
+
homa-0.26.dist-info/METADATA,sha256=l8C-4VxoyVyn69qQ6aXTUBo9XE5tCtZ6kJnDLMVUORs,2472
|
|
26
|
+
homa-0.26.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
27
|
+
homa-0.26.dist-info/top_level.txt,sha256=i1-Cx_lkcOD5QJEK9JYp1uDEBhtshAN7No-99mhpOZ0,11
|
|
28
|
+
homa-0.26.dist-info/RECORD,,
|
homa-0.24.dist-info/RECORD
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
homa/__init__.py,sha256=fImpDDouSHoDdq-q-O0p8RirzGTgXXRI4Ol_LU4f9sI,182
|
|
2
|
-
homa/camera.py,sha256=PHZb3sX0EFdwLDixYindluVDftg6JZlG_Ssbd3hgiNE,464
|
|
3
|
-
homa/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
homa/events.py,sha256=Q077YcaM8-VjfKYhPQCQ7dasdu-mACKMf5cupiLNDoY,1946
|
|
5
|
-
homa/filters.py,sha256=lEwUZtCUSH59D4J9lWQ-d0ObSk_ikZBGRnNAZWMnpPo,1058
|
|
6
|
-
homa/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
-
homa/main.py,sha256=qba9W9x3o3iA6XeQoUAoXPLiXX_WA-7icdcBvSOvMI8,1733
|
|
8
|
-
homa/orientation.py,sha256=kR7mEmbjCdyxNeQ7UuGpwTFD6EaNbXmErzaln3gpzfk,804
|
|
9
|
-
homa/shapes.py,sha256=MVZWkOtqkby8KiL04mK4nrirDGeQM3k8dDEZIpDt8AU,283
|
|
10
|
-
homa/spaces.py,sha256=yEIXofkM0ebvRBbRp-e7epETHW_xmwSrCoTyYUYV-uA,460
|
|
11
|
-
homa/classes/Collection.py,sha256=7hskbC8wxTAC3hHmFYXtzR5W05lsA4GaYTzjiez_6Zg,222
|
|
12
|
-
homa/classes/Logger.py,sha256=2VjXJzBLMW5joArFpu2wGrbWUw7S-77z7LNhKUG1Iow,93
|
|
13
|
-
homa/classes/Repository.py,sha256=w7hlbj6QIWNV2lWNs5-j6OXacSm6UGQ9DtX1zxaUA7c,589
|
|
14
|
-
homa/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
homa/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
-
homa/helpers/alias.py,sha256=AI-e36ZzAiicbXbbNyuBzgtY5t3k_Tq8kJVV2kUoDwg,301
|
|
17
|
-
homa/helpers/environment.py,sha256=I7rD9B5zv3W8lkspntcshm5PZZRRSW81OqIjKOdZW6U,78
|
|
18
|
-
homa/helpers/kernel.py,sha256=sAdIW92coy0BoAPlk5Ez4sE5iFU207TU7OfjP7sPSkM,330
|
|
19
|
-
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
-
tests/test_images.py,sha256=4k5tDcMc2YZOKAq3wNQnbJ_cO1Y_DQ-YUn82yzy__ww,772
|
|
21
|
-
homa-0.24.dist-info/LICENSE,sha256=js3WDbJn9k5EN6sy1uuP2QBXxyPgS5DjO4Bf5yE35hQ,1072
|
|
22
|
-
homa-0.24.dist-info/METADATA,sha256=3eqtheZ4LrpJ_l3mY6S2SFDP16WloldQOK_LvnqaduI,2472
|
|
23
|
-
homa-0.24.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
|
24
|
-
homa-0.24.dist-info/top_level.txt,sha256=i1-Cx_lkcOD5QJEK9JYp1uDEBhtshAN7No-99mhpOZ0,11
|
|
25
|
-
homa-0.24.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|