needs to install mvtb, opencv-contrib-python-headless
ansitable, pgraph, spatialmath

extras for open3d
extras for data

pip install 


--- 20250308

unit test for plane, check all argument possibilities
use random pattern for testing dice

checkin blob
fixup sphinx build errors
test __eq__ logic, copy size check to other equality tests

--- 20260412

mypy src/machinevisiontoolbox --ignore-missing-imports 2>&1 | grep 'error:' | sed 's/.*error: //' | sort | uniq -c | sort -rn | head -20

Reading through these, they fall into a few distinct root causes:

**Structural / mixin architecture (~70 errors)**
- `[call-arg]` (21+17+13) and `[attr-defined]` (18+14+11+9) — The cooperative multiple-inheritance mixin chain (`ImageReshapeMixin`, `ImageSpatialMixin`, etc.) references attributes like `_A`, `colororder`, `domain` that are defined across sibling mixins. Mypy can't resolve them through the MRO. The fix is a shared `Protocol` that declares those attributes once, which all mixins `assert isinstance(self, MyProtocol)` against. One Protocol → fixes ~80 errors.
- `[override]` (25) — A base attribute defined as `self.x = ...` is overridden by a `@property`. Structural issue in the class hierarchy.
- `[return-value]` (13) — Mixin methods returning `ImageProcessingMixin` where `Image` is expected; should use `-> Self`.

**ArrayLike union too broad (~55 errors)**
- `[index]` (47+9) and `[arg-type]` len() (8) — The `float | int | list | tuple | ndarray` union includes non-indexable/non-Sized types. Every place that accepts this union and then indexes or calls `len()` without first coercing via `np.asarray()` triggers an error. Narrowing the union or coercing earlier would clear these.

**Abstract stubs (45 `[empty-body]`)**
- Methods with `pass` or `...` bodies that aren't declared `@abstractmethod`. Mostly a suppression/annotation issue, not real bugs.

**Likely real bugs**
- 8 × `dict | None` indexed without a None check
- 8 × `int` assigned to `str | None`  
- 13 × `None | ndarray` passed to `project_point` which doesn't accept `None`
- 9 × missing `return` (non-abstract functions with control paths that fall off the end)
- 8 × `BaseFeature2D.list` used as a type annotation (method name used where a type is expected)

So roughly: ~150 structural mixin errors fixable in one go with a Protocol, ~55 ArrayLike errors fixable by tightening that union type definition, 45 stub suppressions, and ~45 real defects worth investigating individually.

--

Abstract stubs (45 [empty-body])

Methods with pass or ... bodies that aren't declared @abstractmethod. Mostly a suppression/annotation issue, not real bugs.
Likely real bugs

8 × dict | None indexed without a None check
8 × int assigned to str | None
13 × None | ndarray passed to project_point which doesn't accept None
9 × missing return (non-abstract functions with control paths that fall off the end)
8 × BaseFeature2D.list used as a type annotation (method name used where a type is expected)
So roughly: ~150 structural mixin errors fixable in one go with a Protocol, ~55 ArrayLike errors fixable by tightening that union type definition, 45 stub suppressions, and ~45 real defects worth investigating individually.