machinevision-toolbox-python 2.3.0__tar.gz → 2.4.1__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.
Files changed (85) hide show
  1. machinevision_toolbox_python-2.4.1/.release-please-manifest.json +3 -0
  2. machinevision_toolbox_python-2.4.1/AGENTS.md +30 -0
  3. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/CHANGELOG.md +62 -0
  4. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/PKG-INFO +8 -6
  5. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/README.md +1 -0
  6. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/pyproject.toml +16 -8
  7. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/BagOfWords.py +13 -1
  8. machinevision_toolbox_python-2.4.1/src/machinevisiontoolbox/BundleAdjust.py +1067 -0
  9. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/Camera.py +101 -18
  10. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageConstants.py +27 -6
  11. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageCore.py +69 -8
  12. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageFiducials.py +16 -8
  13. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageIO.py +8 -0
  14. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImagePointFeatures.py +13 -2
  15. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageWholeFeatures.py +18 -5
  16. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/Kernel.py +29 -0
  17. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/PointCloud.py +17 -4
  18. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/Sources.py +18 -9
  19. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/__init__.py +1 -0
  20. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/color.py +42 -16
  21. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/imageio.py +541 -443
  22. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/types.py +14 -0
  23. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/mvtbtool.py +2 -1
  24. machinevision_toolbox_python-2.4.1/src/machinevisiontoolbox/blocks/Icons/README.md +28 -0
  25. machinevision_toolbox_python-2.4.1/src/machinevisiontoolbox/blocks/Icons/make_icons.py +111 -0
  26. machinevision_toolbox_python-2.3.0/.release-please-manifest.json +0 -3
  27. machinevision_toolbox_python-2.3.0/src/machinevisiontoolbox/BundleAdjust.py +0 -1064
  28. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/.githooks/pre-commit +0 -0
  29. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/.gitignore +0 -0
  30. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/LICENSE +0 -0
  31. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/Makefile +0 -0
  32. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/README.md +0 -0
  33. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/blobs1.py +0 -0
  34. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/blobs2.py +0 -0
  35. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/bunny.py +0 -0
  36. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/color.py +0 -0
  37. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/corners.py +0 -0
  38. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/matching.py +0 -0
  39. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/monalisa.py +0 -0
  40. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/morphdemo.py +0 -0
  41. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/randomdots.py +0 -0
  42. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/ransac_line.py +0 -0
  43. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/ros_stream.py +0 -0
  44. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/showzip.py +0 -0
  45. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/torch-yolo.py +0 -0
  46. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/examples/torch_seg.py +0 -0
  47. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/release-please-config.json +0 -0
  48. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageBlobs.py +0 -0
  49. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageColor.py +0 -0
  50. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageLineFeatures.py +0 -0
  51. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageMorph.py +0 -0
  52. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageMultiview.py +0 -0
  53. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageProcessing.py +0 -0
  54. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageRegionFeatures.py +0 -0
  55. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageReshape.py +0 -0
  56. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageSpatial.py +0 -0
  57. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/ImageTensor.py +0 -0
  58. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/VisualServo.py +0 -0
  59. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/__init__.py +0 -0
  60. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/_image_typing.py +0 -0
  61. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/data.py +0 -0
  62. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/findpeaks.py +0 -0
  63. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/graphics.py +0 -0
  64. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/meshgrid.py +0 -0
  65. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/shapes.py +0 -0
  66. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/base/version.py +0 -0
  67. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/_bintools.py +0 -0
  68. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/_iminteractive.py +0 -0
  69. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/bagtool.py +0 -0
  70. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/imtool.py +0 -0
  71. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/ocrtool.py +0 -0
  72. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/bin/tagtool.py +0 -0
  73. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/Icons/camera.png +0 -0
  74. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/Icons/estpose_p.png +0 -0
  75. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/Icons/imageplane.png +0 -0
  76. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/Icons/visjac_p.png +0 -0
  77. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/__init__.py +0 -0
  78. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/camera.py +0 -0
  79. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/blocks/test_blocks.py +0 -0
  80. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/camera_derivatives.py +0 -0
  81. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/decorators.py +0 -0
  82. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/fiducial.py +0 -0
  83. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/src/machinevisiontoolbox/mvtb_types.py +0 -0
  84. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/symbolic/README.md +0 -0
  85. {machinevision_toolbox_python-2.3.0 → machinevision_toolbox_python-2.4.1}/symbolic/bundle-adjust.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "2.4.1"
3
+ }
@@ -0,0 +1,30 @@
1
+ # machinevision-toolbox-python — Agent Instructions
2
+
3
+ Part of the RVC ecosystem. **Read [rvc-ecosystem/AGENTS.md](https://github.com/petercorke/rvc-ecosystem/blob/main/AGENTS.md) first** — it defines shared conventions: repo ownership, math invariants, dependency boundaries, git/PR workflow, code standards, tech-debt tracking. This file only adds what's specific to this repo.
4
+
5
+ | | |
6
+ |---|---|
7
+ | PyPI package | `machinevision-toolbox-python` |
8
+ | Nickname | MVTB |
9
+ | Owner | Peter Corke (`petercorke`) |
10
+ | Default branch | `main` |
11
+ | Contribution model | Branch → PR; direct push to `main` at Peter's discretion |
12
+
13
+ ## Notes specific to this repo
14
+
15
+ - Pure Python — no compiled extensions, builds with Hatch (`hatchling`) directly.
16
+ - Depends on `spatialmath`, `pgraph-python`, `ansitable`, plus the third-party `opencv-python`/
17
+ `opencv-contrib-python` and `open3d`.
18
+ - `open3d` is consistently a Python version or two behind — never assume it supports the
19
+ latest Python release; check compatibility before bumping this repo's Python floor/ceiling.
20
+ - OpenCV 5.x support was just added alongside the existing 4.x support (a major version jump,
21
+ not a minor bump). This is fresh work — aim to keep both working, but treat 4.x/5.x
22
+ compatibility friction as expected teething problems to fix, not a regression.
23
+ - Tech-debt tracked as GitHub Issues labelled `tech-debt` (migrated 2026-08-02) — this repo
24
+ was first to migrate off `tech-debt.md`.
25
+ - This repo's `.github/pull_request_template.md` and `.github/ISSUE_TEMPLATE/*.yml` are the
26
+ canonical source other repos' templates were copied from — check here first if updating
27
+ template content ecosystem-wide.
28
+ - Codacy is wired in (badge + automated PR comments); grade A is the aspiration. Real backlog
29
+ exists, tracked via `tech-debt`-labelled issues (including a "mypy not in CI" entry) — see
30
+ ecosystem `AGENTS.md` §5 for how that target is framed.
@@ -1,5 +1,67 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.1](https://github.com/petercorke/machinevision-toolbox-python/compare/v2.4.0...v2.4.1) (2026-10-13)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * BundleAdjust fixed landmarks and pgraph 1.0 Vertex ([1467091](https://github.com/petercorke/machinevision-toolbox-python/commit/14670915f109ea1b57ea3f3adc2d2f3805e53296))
9
+ * BundleAdjust fixed landmarks and pgraph 1.0 Vertex ([195e895](https://github.com/petercorke/machinevision-toolbox-python/commit/195e895aa8240c722472fbd31a3be4b91ca9524d))
10
+ * **docs:** install spatialmath and pgraph with deps=False in JupyterLite ([201f234](https://github.com/petercorke/machinevision-toolbox-python/commit/201f23487f9f7628d0df2b0cef386175740972a2))
11
+ * **docs:** install spatialmath and pgraph with deps=False in JupyterLite ([5615b3b](https://github.com/petercorke/machinevision-toolbox-python/commit/5615b3b7d147e44ae1f2d032deec13bfc69f548a))
12
+ * don't pass a positional argument to pgraph.UGraph ([f5590e0](https://github.com/petercorke/machinevision-toolbox-python/commit/f5590e03b6d35d2bcbf62519c1de82d231790169))
13
+ * don't pass a positional argument to pgraph.UGraph ([6fb62e5](https://github.com/petercorke/machinevision-toolbox-python/commit/6fb62e50a8d79dd748fab62cbd3054e98af57375))
14
+ * estimatePose misaligned ids and corners when other markers are in view ([43c5980](https://github.com/petercorke/machinevision-toolbox-python/commit/43c5980c94b42c861b1f6b441df3b39733412414))
15
+ * FiducialCollection.estimatePose() misaligned ids and corners ([#52](https://github.com/petercorke/machinevision-toolbox-python/issues/52)) ([c054867](https://github.com/petercorke/machinevision-toolbox-python/commit/c0548678c81b2ba46b279946e00a5276a2f9e2ae))
16
+ * remove labeltool console script that points at a module that was never committed ([#117](https://github.com/petercorke/machinevision-toolbox-python/issues/117)) ([ef39fa9](https://github.com/petercorke/machinevision-toolbox-python/commit/ef39fa96b89ac7f9723442230baf27e1a5b6140e))
17
+ * remove labeltool console script whose module was never committed ([30b5c6a](https://github.com/petercorke/machinevision-toolbox-python/commit/30b5c6a9ad19b1b73ad969897abee61c0ad556a5))
18
+
19
+
20
+ ### Documentation
21
+
22
+ * add a script and README for the block icons ([1185da9](https://github.com/petercorke/machinevision-toolbox-python/commit/1185da946260c675561405c4c6059eeace2d1d6d))
23
+ * add a script and README for the block icons ([2206b53](https://github.com/petercorke/machinevision-toolbox-python/commit/2206b532e03af6ea8a6cf85c0a0855fcb95b2a52))
24
+ * add Codacy grade badge to README ([f91ed2c](https://github.com/petercorke/machinevision-toolbox-python/commit/f91ed2c8a74daf8baf01632548d3d3c23fc06293))
25
+ * add CONTRIBUTING.md ([1885fc1](https://github.com/petercorke/machinevision-toolbox-python/commit/1885fc153bf885fa317473cb5b1f7d887cbe0f97))
26
+ * note how to use a phone as a camera in WebCam and VideoCamera ([76cea5e](https://github.com/petercorke/machinevision-toolbox-python/commit/76cea5e6f035b558330c0aab1bf7a036100dbf92))
27
+ * note how to use a phone as a camera in WebCam and VideoCamera ([72ca04b](https://github.com/petercorke/machinevision-toolbox-python/commit/72ca04b30f0f87af1118659d74e59b32978902d0))
28
+
29
+ ## [2.4.0](https://github.com/petercorke/machinevision-toolbox-python/compare/v2.3.0...v2.4.0) (2026-08-25)
30
+
31
+
32
+ ### Features
33
+
34
+ * add __array__ protocol to Image and Kernel, ndim to Kernel ([e762f57](https://github.com/petercorke/machinevision-toolbox-python/commit/e762f578faa269655cbd06b02d48c4c30d48c516))
35
+ * relax opencv pin to support both 4.x and 5.x, add CI matrix axis ([2ec69fe](https://github.com/petercorke/machinevision-toolbox-python/commit/2ec69fe4d116bb51f717e0a4a3c8baed95a7101f)), closes [#44](https://github.com/petercorke/machinevision-toolbox-python/issues/44)
36
+
37
+
38
+ ### Bug Fixes
39
+
40
+ * assert hygiene -- unreachable assert, two caller-facing checks ([7afe33e](https://github.com/petercorke/machinevision-toolbox-python/commit/7afe33eb02af65d4e64d52481f668a610f63b807))
41
+ * CameraBase.plot() unbound call (self=None) crashed instead of working ([e2d4600](https://github.com/petercorke/machinevision-toolbox-python/commit/e2d460029d6ef1d5bb807168f37b37b3eb10ff1c))
42
+ * catch cv2.error in points2F(), not just F/mask=None ([c4197cb](https://github.com/petercorke/machinevision-toolbox-python/commit/c4197cbd22784b8c002df8a02bb95764dc589b50))
43
+ * correct stale open3d-python PyPI name, add py3.13 exclusion marker ([87c1e8f](https://github.com/petercorke/machinevision-toolbox-python/commit/87c1e8f5a2eb3a2b17f2a1f1c182b22fbb025483))
44
+ * esttheta() -- broken pickregion() helper and missing theta-sweep body ([50b00cc](https://github.com/petercorke/machinevision-toolbox-python/commit/50b00cc95c15b56b3598505f4cd532a0612f6ff9))
45
+ * exclude tests/ from Bandit's assert_used (B101) check ([e62b116](https://github.com/petercorke/machinevision-toolbox-python/commit/e62b116e0b57aef73882ee4689153eda326c399f))
46
+ * Histogram.plot(type='ncdf') never actually worked, docstring lied ([6d4152d](https://github.com/petercorke/machinevision-toolbox-python/commit/6d4152d58bb63970863ff0ca49593c21ec815b5b))
47
+ * idisp() crashes when reuse=True with no title given ([a05b13b](https://github.com/petercorke/machinevision-toolbox-python/commit/a05b13b93ab4ed03397548348e8de48230b284f3))
48
+ * Image.metadata() missing camera-specific Exif sub-IFD tags ([d554ef2](https://github.com/petercorke/machinevision-toolbox-python/commit/d554ef257d2d494c66daaf928114c8097fb8fb91))
49
+ * Image() drops maxintval when dtype= is also given, silently truncating ([15f1d32](https://github.com/petercorke/machinevision-toolbox-python/commit/15f1d32576183c862592dca009828ea7e2765d79))
50
+ * Image(dtype='float') resolved to float64, not float32 ([18c5d85](https://github.com/petercorke/machinevision-toolbox-python/commit/18c5d85d82ebd2c09a43adb278e4435658f0c2b7))
51
+ * ImageConstantsMixin factories silently downcast explicit dtype requests ([977dbf6](https://github.com/petercorke/machinevision-toolbox-python/commit/977dbf6402307f38f695c697d68009ddd914d237))
52
+ * mvtbtool's %precision line spuriously echoes with --showassign ([ed43ca6](https://github.com/petercorke/machinevision-toolbox-python/commit/ed43ca64652a7d64a4536ae5665e672ffcc7db4a))
53
+ * name2color() colororder reordering returns list, not ndarray ([c90e6fb](https://github.com/petercorke/machinevision-toolbox-python/commit/c90e6fb4db7814707fd1548a7d87b1057b665499))
54
+ * PointCloud.Read() double-joins a caller-supplied "data/" prefix ([fff671c](https://github.com/petercorke/machinevision-toolbox-python/commit/fff671cdd28c85a555ee9fc0b7dd6f4bad4eccc9))
55
+ * printstats() crashes if .stats hasn't been accessed yet ([3484224](https://github.com/petercorke/machinevision-toolbox-python/commit/34842247c529159364591528ec109deac182899f))
56
+ * suppress divide-by-zero RuntimeWarning in BagOfWords idf computation ([05c85e0](https://github.com/petercorke/machinevision-toolbox-python/commit/05c85e0189061019dc55888b33ddb30cc3e9d9ae))
57
+ * visual-odometry robustness -- match() metric, points2F(), BundleAdjust ([8691847](https://github.com/petercorke/machinevision-toolbox-python/commit/8691847df58cc3cf003838436f7d94c59d5ae609))
58
+
59
+
60
+ ### Documentation
61
+
62
+ * add AGENTS.md stub linking to rvc-ecosystem conventions ([0827291](https://github.com/petercorke/machinevision-toolbox-python/commit/082729184414b821a9e610f8a409f5cbeabc308c))
63
+ * points2F() kwargs -- correct which params apply to which method ([6b10d64](https://github.com/petercorke/machinevision-toolbox-python/commit/6b10d6401925564163568a09e1e504c99eec99fa))
64
+
3
65
  ## [2.3.0](https://github.com/petercorke/machinevision-toolbox-python/compare/v2.2.0...v2.3.0) (2026-08-13)
4
66
 
5
67
  **Highlight: Notebooks working in all environments** Fixed a number of problems with getting notebooks to execute in desktop Jupyter, Colab, and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: machinevision-toolbox-python
3
- Version: 2.3.0
3
+ Version: 2.4.1
4
4
  Summary: Object-oriented machine vision for Python.
5
5
  Project-URL: Homepage, https://github.com/petercorke/machinevision-toolbox-python
6
6
  Project-URL: Bug Tracker, https://github.com/pypa/sampleproject/issues
@@ -18,14 +18,15 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
21
22
  Requires-Python: >=3.10
22
23
  Requires-Dist: ansitable
23
24
  Requires-Dist: matplotlib
24
25
  Requires-Dist: mvtb-data
25
26
  Requires-Dist: numpy
26
- Requires-Dist: opencv-contrib-python<5.0.0
27
- Requires-Dist: opencv-python<5.0.0
28
- Requires-Dist: pgraph-python
27
+ Requires-Dist: opencv-contrib-python<6.0.0,>=4.5
28
+ Requires-Dist: opencv-python<6.0.0,>=4.5
29
+ Requires-Dist: pgraph-python>=0.6.4
29
30
  Requires-Dist: pillow
30
31
  Requires-Dist: requests
31
32
  Requires-Dist: scipy
@@ -35,7 +36,7 @@ Provides-Extra: all
35
36
  Requires-Dist: ipympl; extra == 'all'
36
37
  Requires-Dist: ipython; extra == 'all'
37
38
  Requires-Dist: ipywidgets; extra == 'all'
38
- Requires-Dist: open3d-python; extra == 'all'
39
+ Requires-Dist: open3d; extra == 'all'
39
40
  Requires-Dist: pygments; extra == 'all'
40
41
  Requires-Dist: pytesseract; extra == 'all'
41
42
  Requires-Dist: rosbags; extra == 'all'
@@ -64,7 +65,7 @@ Requires-Dist: ipywidgets; extra == 'jupyter'
64
65
  Provides-Extra: ocr
65
66
  Requires-Dist: pytesseract; extra == 'ocr'
66
67
  Provides-Extra: open3d
67
- Requires-Dist: open3d-python; extra == 'open3d'
68
+ Requires-Dist: open3d; extra == 'open3d'
68
69
  Provides-Extra: ros
69
70
  Requires-Dist: rosbags; extra == 'ros'
70
71
  Requires-Dist: roslibpy; extra == 'ros'
@@ -105,6 +106,7 @@ Description-Content-Type: text/markdown
105
106
  [![Downloads](https://static.pepy.tech/badge/machinevision-toolbox-python/month)](https://pepy.tech/projects/machinevision-toolbox-python)
106
107
  ![Python Version](https://img.shields.io/pypi/pyversions/machinevision-toolbox-python.svg)
107
108
  [![Coverage](https://codecov.io/gh/petercorke/machinevision-toolbox-python/branch/main/graph/badge.svg)](https://codecov.io/gh/petercorke/machinevision-toolbox-python)
109
+ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/2368752f2103490b81210d716bb0fb46)](https://app.codacy.com/gh/petercorke/machinevision-toolbox-python/dashboard)
108
110
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
109
111
 
110
112
  ### Ecosystem & Dependencies
@@ -27,6 +27,7 @@
27
27
  [![Downloads](https://static.pepy.tech/badge/machinevision-toolbox-python/month)](https://pepy.tech/projects/machinevision-toolbox-python)
28
28
  ![Python Version](https://img.shields.io/pypi/pyversions/machinevision-toolbox-python.svg)
29
29
  [![Coverage](https://codecov.io/gh/petercorke/machinevision-toolbox-python/branch/main/graph/badge.svg)](https://codecov.io/gh/petercorke/machinevision-toolbox-python)
30
+ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/2368752f2103490b81210d716bb0fb46)](https://app.codacy.com/gh/petercorke/machinevision-toolbox-python/dashboard)
30
31
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
31
32
 
32
33
  ### Ecosystem & Dependencies
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "machinevision-toolbox-python"
3
- version = "2.3.0"
3
+ version = "2.4.1"
4
4
  authors = [{ name = "Peter Corke", email = "rvc@petercorke.com" }]
5
5
  description = "Object-oriented machine vision for Python."
6
6
  readme = "README.md"
@@ -14,6 +14,7 @@ classifiers = [
14
14
  "Programming Language :: Python :: 3.11",
15
15
  "Programming Language :: Python :: 3.12",
16
16
  "Programming Language :: Python :: 3.13",
17
+ "Programming Language :: Python :: 3.14",
17
18
 
18
19
  "License :: OSI Approved :: MIT License",
19
20
  "Operating System :: OS Independent",
@@ -39,10 +40,10 @@ dependencies = [
39
40
  "scipy",
40
41
  "matplotlib",
41
42
  "pillow",
42
- "opencv-python<5.0.0",
43
- "opencv-contrib-python<5.0.0",
43
+ "opencv-python>=4.5,<6.0.0",
44
+ "opencv-contrib-python>=4.5,<6.0.0",
44
45
  "spatialmath-python",
45
- "pgraph-python",
46
+ "pgraph-python>=0.6.4",
46
47
  "ansitable",
47
48
  "mvtb-data",
48
49
  "requests",
@@ -62,7 +63,7 @@ dependencies = [
62
63
  # dev - development tools
63
64
  # docs - documentation building tools
64
65
  # jupyter - jupyter notebook support
65
- # open3d - open3d support (open3d generally won't work with latest Python)
66
+ # open3d - open3d support
66
67
  # all - all runtime optional features below
67
68
  # ocr - OCR support via pytesseract
68
69
  # tool - dependencies for the mvtbtool interactive shell
@@ -86,7 +87,7 @@ docs = [
86
87
 
87
88
  jupyter = ["ipywidgets", "ipympl"]
88
89
 
89
- open3d = ["open3d-python"]
90
+ open3d = ["open3d"]
90
91
 
91
92
  torch = ["torch"]
92
93
 
@@ -95,7 +96,7 @@ ocr = ["pytesseract"]
95
96
  all = [
96
97
  "ipywidgets",
97
98
  "ipympl",
98
- "open3d-python",
99
+ "open3d",
99
100
  "torch",
100
101
  "pytesseract",
101
102
  "rosbags",
@@ -119,6 +120,14 @@ select = ["E", "F", "I"]
119
120
  [tool.ruff.lint.isort]
120
121
  known-first-party = ["machinevisiontoolbox"]
121
122
 
123
+ [tool.bandit]
124
+ # bare `assert` is idiomatic pytest style, not a security concern -- Bandit's
125
+ # B101 ("assert used") is meant for src/, where assert can silently vanish
126
+ # under `python -O`. Excluding tests/ keeps that check meaningful without
127
+ # flagging every test assertion (Codacy runs Bandit via Prospector and
128
+ # honours this file).
129
+ exclude_dirs = ["tests"]
130
+
122
131
  [tool.pyright]
123
132
  include = ["src"]
124
133
  ignore = ["docs", "tests", "examples"]
@@ -129,7 +138,6 @@ imtool = "machinevisiontoolbox.bin.imtool:main"
129
138
  tagtool = "machinevisiontoolbox.bin.tagtool:main"
130
139
  ocrtool = "machinevisiontoolbox.bin.ocrtool:main"
131
140
  bagtool = "machinevisiontoolbox.bin.bagtool:main"
132
- labeltool = "machinevisiontoolbox.bin.labeltool:main"
133
141
 
134
142
  [build-system]
135
143
  requires = ["hatchling"]
@@ -58,6 +58,13 @@ class BagOfWords:
58
58
  of image features is assigned labels from the ``.centroids`` any with a
59
59
  label greater that ``.nstopwords`` is a stop word and can be discarded.
60
60
 
61
+ .. note:: Removing stop words can leave a remaining word that never
62
+ occurs in any image, giving it an inverse document frequency (idf)
63
+ of ``inf`` (``log(N / 0)``). This is harmless -- every place idf is
64
+ used to compute a word-frequency vector, the corresponding word
65
+ count is also always zero there, so the ``0 * inf`` result is
66
+ ``nan`` and gets replaced with 0 before the vector is returned.
67
+
61
68
  :reference:
62
69
  - Video Google: a text retrieval approach to object matching in videos
63
70
  J.Sivic and A.Zisserman,
@@ -139,7 +146,12 @@ class BagOfWords:
139
146
  # total number of occurrences of word i
140
147
  # multiple occurrences in the one image count only as one
141
148
  ni = (W > 0).sum(axis=1)
142
- idf = np.log(N / ni)
149
+ # a word that never occurs in any image (ni=0, possible after
150
+ # stopword removal) gives idf=inf here; harmless since nid is
151
+ # always 0 at that same position below, so 0*inf->nan, already
152
+ # suppressed by the invalid="ignore" there.
153
+ with np.errstate(divide="ignore"):
154
+ idf = np.log(N / ni)
143
155
 
144
156
  M = []
145
157