Fix Python Scalar typing issue #27528#27620
Conversation
|
Thank you for contribution. AliasTypeNode.sequence_("Scalar", PrimitiveTypeNode.float_(),
doc="Max sequence length is at most 4"),instead of AliasTypeNode.union_(
"Scalar",
items=(SequenceTypeNode("Scalar", PrimitiveTypeNode.float_()),
PrimitiveTypeNode.float_()),
doc="Max sequence length is at most 4"
),Example: @_typing.overload
def line(img: cv2.typing.MatLike, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int = ..., lineType: int = ..., shift: int = ...) -> cv2.typing.MatLike: ...
# HERE GOES float OVERLOAD
@_typing.overload
def line(img: cv2.typing.MatLike, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: float, thickness: int = ..., lineType: int = ..., shift: int = ...) -> cv2.typing.MatLike: ...
@_typing.overload
def line(img: UMat, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: cv2.typing.Scalar, thickness: int = ..., lineType: int = ..., shift: int = ...) -> UMat: ...
# HERE GOES float OVERLOAD
@_typing.overload
def line(img: UMat, pt1: cv2.typing.Point, pt2: cv2.typing.Point, color: float, thickness: int = ..., lineType: int = ..., shift: int = ...) -> UMat: ...Functions returning @_typing.overload
def mean(src: cv2.typing.MatLike, mask: cv2.typing.MatLike | None = ...) -> cv2.typing.Scalar: ...
@_typing.overload
def mean(src: UMat, mask: UMat | None = ...) -> cv2.typing.Scalar: ... |
Addresses issues opencv#27528, opencv#26818, opencv#26826 by implementing the function overloads solution suggested by VadimLevin in PR opencv#27620. Changes: 1. predefined_types.py: Change Scalar from Union to Sequence[float] 2. api_refinement.py: Add global function overload generation 3. Generate both Scalar and float overloads for drawing functions This provides better MyPy compatibility while maintaining backward compatibility. All existing code continues to work unchanged. Testing: Comprehensive test suite validates all scenarios pass
a9b79c8 to
f23ce03
Compare
|
FYI, I've rebased the branch and added a test, followed by a force push. |
|
Change is targeting only returned @_typing.overload
def mean(src: cv2.typing.MatLike, mask: cv2.typing.MatLike | None = ...) -> cv2.typing.Scalar: ...
@_typing.overload
def mean(src: UMat, mask: UMat | None = ...) ->cv2.typing.Scalar: ...
@_typing.overload
def trace(mtx: cv2.typing.MatLike) -> cv2.typing.Scalar: ...
@_typing.overload
def trace(mtx: UMat) -> cv2.typing.Scalar: ...
@_typing.overload
def sumElems(src: cv2.typing.MatLike) -> cv2.typing.Scalar: ...
@_typing.overload
def sumElems(src: UMat) -> cv2.typing.Scalar: ...After: @_typing.overload
def mean(src: cv2.typing.MatLike, mask: cv2.typing.MatLike | None = ...) -> tuple[float, float, float, float]: ...
@_typing.overload
def mean(src: UMat, mask: UMat | None = ...) -> tuple[float, float, float, float]: ...
@_typing.overload
def trace(mtx: cv2.typing.MatLike) -> tuple[float, float, float, float]: ...
@_typing.overload
def trace(mtx: UMat) -> tuple[float, float, float, float]: ...
@_typing.overload
def sumElems(src: cv2.typing.MatLike) -> tuple[float, float, float, float]: ...
@_typing.overload
def sumElems(src: UMat) -> tuple[float, float, float, float]: ...while AliasTypeNode.union_(
"Scalar",
items=(SequenceTypeNode("Scalar", PrimitiveTypeNode.float_()),
PrimitiveTypeNode.float_()),
doc="Max sequence length is at most 4"
), |
closes #27528
Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
Patch to opencv_extra has the same branch name.