ai-virtual-mouse-controller 1.0.2__tar.gz → 1.0.4__tar.gz
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.
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/PKG-INFO +2 -2
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/ai_virtual_mouse_controller.egg-info/PKG-INFO +2 -2
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/ai_virtual_mouse_controller.egg-info/requires.txt +1 -1
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/__init__.py +1 -1
- ai_virtual_mouse_controller-1.0.4/main.py +80 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/pyproject.toml +6 -2
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_hologram_overlay.py +7 -0
- ai_virtual_mouse_controller-1.0.2/main.py +0 -47
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/LICENSE +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/README.md +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/ai_virtual_mouse_controller.egg-info/SOURCES.txt +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/ai_virtual_mouse_controller.egg-info/dependency_links.txt +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/ai_virtual_mouse_controller.egg-info/entry_points.txt +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/ai_virtual_mouse_controller.egg-info/top_level.txt +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/config.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/camera.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/click_burst.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/cursor_controller.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/finger_posture.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/gesture_detector.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hand_anchor.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hand_mesh.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hand_renderer.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hand_tracker.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hologram_gl_backend.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hologram_overlay.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/perf_telemetry.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/runtime_settings.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/smoothing.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/ui_overlay.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/utils.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/services/__init__.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/services/virtual_mouse_service.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/setup.cfg +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_click_burst.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_cursor_click_at.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_gesture_detector.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_hand_renderer.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_overlay_smoke.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_perf_telemetry.py +0 -0
- {ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_smoothing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ai-virtual-mouse-controller
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.4
|
|
4
4
|
Summary: Controle de cursor por gestos da mao via webcam, com holograma 3D opcional.
|
|
5
5
|
Author: Guilherme Moraes Franco
|
|
6
6
|
License: MIT
|
|
@@ -27,7 +27,7 @@ Requires-Python: <3.14,>=3.11
|
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
28
28
|
License-File: LICENSE
|
|
29
29
|
Requires-Dist: opencv-python<5.0.0,>=4.10.0
|
|
30
|
-
Requires-Dist: mediapipe<0.
|
|
30
|
+
Requires-Dist: mediapipe<0.10.30,>=0.10.18
|
|
31
31
|
Requires-Dist: pyautogui<1.0.0,>=0.9.54
|
|
32
32
|
Requires-Dist: numpy<2.2.0,>=1.26.0
|
|
33
33
|
Requires-Dist: moderngl>=5.10.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ai-virtual-mouse-controller
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.4
|
|
4
4
|
Summary: Controle de cursor por gestos da mao via webcam, com holograma 3D opcional.
|
|
5
5
|
Author: Guilherme Moraes Franco
|
|
6
6
|
License: MIT
|
|
@@ -27,7 +27,7 @@ Requires-Python: <3.14,>=3.11
|
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
28
28
|
License-File: LICENSE
|
|
29
29
|
Requires-Dist: opencv-python<5.0.0,>=4.10.0
|
|
30
|
-
Requires-Dist: mediapipe<0.
|
|
30
|
+
Requires-Dist: mediapipe<0.10.30,>=0.10.18
|
|
31
31
|
Requires-Dist: pyautogui<1.0.0,>=0.9.54
|
|
32
32
|
Requires-Dist: numpy<2.2.0,>=1.26.0
|
|
33
33
|
Requires-Dist: moderngl>=5.10.0
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
main.py
|
|
3
|
+
=======
|
|
4
|
+
|
|
5
|
+
Entry point do AI Virtual Mouse Controller.
|
|
6
|
+
|
|
7
|
+
Uso:
|
|
8
|
+
python main.py
|
|
9
|
+
|
|
10
|
+
Ou como modulo:
|
|
11
|
+
python -m main
|
|
12
|
+
|
|
13
|
+
Sai com codigo:
|
|
14
|
+
0 = ok
|
|
15
|
+
1 = falha de webcam
|
|
16
|
+
2 = erro inesperado
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import logging
|
|
22
|
+
import sys
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _check_environment() -> None:
|
|
26
|
+
"""Verifica versoes criticas ANTES de qualquer import do projeto.
|
|
27
|
+
|
|
28
|
+
Mediapipe 0.11+ removeu mp.solutions.hands que esse projeto usa.
|
|
29
|
+
Se o usuario tem 0.11+ instalado globalmente, mostramos mensagem
|
|
30
|
+
clara com comando de fix em vez de AttributeError obscuro.
|
|
31
|
+
"""
|
|
32
|
+
try:
|
|
33
|
+
import mediapipe as mp
|
|
34
|
+
except ImportError:
|
|
35
|
+
sys.stderr.write(
|
|
36
|
+
"\nERRO: mediapipe nao esta instalado.\n"
|
|
37
|
+
"Solucao: pip install ai-virtual-mouse-controller\n\n"
|
|
38
|
+
)
|
|
39
|
+
sys.exit(1)
|
|
40
|
+
|
|
41
|
+
if not hasattr(mp, "solutions") or not hasattr(mp.solutions, "hands"):
|
|
42
|
+
version = getattr(mp, "__version__", "desconhecida")
|
|
43
|
+
sys.stderr.write(
|
|
44
|
+
"\n" + "=" * 70 + "\n"
|
|
45
|
+
f"ERRO: mediapipe {version} nao tem mp.solutions.hands.\n"
|
|
46
|
+
"Esse projeto requer mediapipe 0.10.18 a 0.10.21 — o modulo\n"
|
|
47
|
+
"'solutions' foi removido a partir da 0.10.30.\n\n"
|
|
48
|
+
"Solucao rapida (copia e cola no terminal):\n\n"
|
|
49
|
+
' pip install "mediapipe>=0.10.18,<0.10.30" --force-reinstall\n\n'
|
|
50
|
+
"Depois roda 'avmc' de novo.\n"
|
|
51
|
+
+ "=" * 70 + "\n\n"
|
|
52
|
+
)
|
|
53
|
+
sys.exit(1)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _setup_logging() -> None:
|
|
57
|
+
import config
|
|
58
|
+
level = getattr(logging, config.LOG_LEVEL.upper(), logging.INFO)
|
|
59
|
+
logging.basicConfig(
|
|
60
|
+
level=level,
|
|
61
|
+
format="%(asctime)s | %(levelname)-7s | %(name)s | %(message)s",
|
|
62
|
+
datefmt="%H:%M:%S",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def main() -> int:
|
|
67
|
+
# Check ANTES de importar service (que ja tocaria em mediapipe)
|
|
68
|
+
_check_environment()
|
|
69
|
+
|
|
70
|
+
_setup_logging()
|
|
71
|
+
logger = logging.getLogger("main")
|
|
72
|
+
logger.info("AI Virtual Mouse Controller — iniciando...")
|
|
73
|
+
|
|
74
|
+
from services.virtual_mouse_service import VirtualMouseService
|
|
75
|
+
service = VirtualMouseService.from_config()
|
|
76
|
+
return service.run()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
sys.exit(main())
|
|
@@ -11,7 +11,7 @@ build-backend = "setuptools.build_meta"
|
|
|
11
11
|
|
|
12
12
|
[project]
|
|
13
13
|
name = "ai-virtual-mouse-controller"
|
|
14
|
-
version = "1.0.
|
|
14
|
+
version = "1.0.4"
|
|
15
15
|
description = "Controle de cursor por gestos da mao via webcam, com holograma 3D opcional."
|
|
16
16
|
readme = "README.md"
|
|
17
17
|
requires-python = ">=3.11,<3.14"
|
|
@@ -42,7 +42,11 @@ classifiers = [
|
|
|
42
42
|
]
|
|
43
43
|
dependencies = [
|
|
44
44
|
"opencv-python>=4.10.0,<5.0.0",
|
|
45
|
-
|
|
45
|
+
# CRITICAL: mediapipe 0.10.30+ removeu mp.solutions.hands que esse
|
|
46
|
+
# projeto usa. Range estreito 0.10.18-0.10.21 garante o modulo
|
|
47
|
+
# solutions presente. Quando migrarmos pro novo Task API podemos
|
|
48
|
+
# abrir esse range.
|
|
49
|
+
"mediapipe>=0.10.18,<0.10.30",
|
|
46
50
|
"pyautogui>=0.9.54,<1.0.0",
|
|
47
51
|
"numpy>=1.26.0,<2.2.0",
|
|
48
52
|
# v1.0.2: holograma vira default — usuario que roda
|
|
@@ -162,6 +162,13 @@ class TestBurstFiring:
|
|
|
162
162
|
not _PYSIDE_AVAILABLE,
|
|
163
163
|
reason="PySide6 nao instalado",
|
|
164
164
|
)
|
|
165
|
+
@pytest.mark.skipif(
|
|
166
|
+
os.environ.get("CI") == "true",
|
|
167
|
+
reason=(
|
|
168
|
+
"Render real Qt+OpenGL crasha em CI sem display server "
|
|
169
|
+
"(offscreen platform nao garante GL context). Roda local."
|
|
170
|
+
),
|
|
171
|
+
)
|
|
165
172
|
class TestRenderingNoCrash:
|
|
166
173
|
"""Garante que o paint roda sem crashar com varias configuracoes."""
|
|
167
174
|
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
main.py
|
|
3
|
-
=======
|
|
4
|
-
|
|
5
|
-
Entry point do AI Virtual Mouse Controller.
|
|
6
|
-
|
|
7
|
-
Uso:
|
|
8
|
-
python main.py
|
|
9
|
-
|
|
10
|
-
Ou como modulo:
|
|
11
|
-
python -m main
|
|
12
|
-
|
|
13
|
-
Sai com codigo:
|
|
14
|
-
0 = ok
|
|
15
|
-
1 = falha de webcam
|
|
16
|
-
2 = erro inesperado
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from __future__ import annotations
|
|
20
|
-
|
|
21
|
-
import logging
|
|
22
|
-
import sys
|
|
23
|
-
|
|
24
|
-
import config
|
|
25
|
-
from services.virtual_mouse_service import VirtualMouseService
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def _setup_logging() -> None:
|
|
29
|
-
level = getattr(logging, config.LOG_LEVEL.upper(), logging.INFO)
|
|
30
|
-
logging.basicConfig(
|
|
31
|
-
level=level,
|
|
32
|
-
format="%(asctime)s | %(levelname)-7s | %(name)s | %(message)s",
|
|
33
|
-
datefmt="%H:%M:%S",
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def main() -> int:
|
|
38
|
-
_setup_logging()
|
|
39
|
-
logger = logging.getLogger("main")
|
|
40
|
-
logger.info("AI Virtual Mouse Controller — iniciando...")
|
|
41
|
-
|
|
42
|
-
service = VirtualMouseService.from_config()
|
|
43
|
-
return service.run()
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if __name__ == "__main__":
|
|
47
|
-
sys.exit(main())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/cursor_controller.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/finger_posture.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/gesture_detector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hand_renderer.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hand_tracker.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hologram_gl_backend.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/hologram_overlay.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/perf_telemetry.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/core/runtime_settings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/services/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_click_burst.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_hand_renderer.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_overlay_smoke.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_perf_telemetry.py
RENAMED
|
File without changes
|
{ai_virtual_mouse_controller-1.0.2 → ai_virtual_mouse_controller-1.0.4}/tests/test_smoothing.py
RENAMED
|
File without changes
|