Open
Description
OpenCV 3.4.9 / 4.2.0:
arg1 - uint8 matrix with 3 channels:
Mat m__1_2_3(Size(2, 2), CV_8UC3, Scalar(1, 2, 3));
arg2:
5
Scalar(5)
(identical toScalar(5, 0, 0, 0)
)Scalar(5, 1e-6, 0)
Scalar::all(5)
(identical toScalar(5, 5, 5, 5)
)
Result variants:
[6, 2, 3]
- modified 1st channel only[6, 7, 8]
- all channels are modified
# | C++ code | arg1 5 |
arg2 Scalar(5) |
arg3 Scalar (5, 1e-6, 0) |
arg4 Scalar::all(5) |
---|---|---|---|---|---|
1 | cv::add(arg1, arg2, res) |
2 | 1 | 1 | 2 |
2 | MatExprres = arg1 + arg2 |
1 #14738 |
1 | 1 | 2 |
3 | MatExprres = 1.001 * arg1 + arg2 |
2 #14738 |
2 #16538 |
1 | 2 |
Analyse:
- results with
Scalar(5, 1e-6, 0)
(arg3) andScalar::all(5)
(arg4) are consistent and adequate - some other cases should be be deprecated / changed / removed?
- case with numeric scalar (
5
) may have designed to use with complex numbers (emulation through matrices with 2 channels) where5
is interpreted as a real number. - current implicit conversion of
5
intoScalar
(no explicit bug/feature) converts this intoScalar(5, 0, 0, 0)
. Extra overloads may help to avoid implicit conversions (but may break user code).
Related unclear stuff:
- multi-channel
Mat::eye()
without element initializer. - missing
explicit
forVec
andScalar
constructors: cv::Matx33f tmp = true compiles #11956 - almost zero tests for
MatExpr
stuff