Strange behavior of * and + on cv::Mat

asked 2020-02-07 02:28:48 -0600

afshinpir gravatar image

Hi

I'm new in opencv, but I found some strange behavior when I was using * and + on cv::Mat. I have build opencv 4.2.0 myself and I'm using that version.

1- different between * and *=

Look at following code:

auto mat = cv::Mat::eye(2, 2, CV_32FC3);
std::cout << mat << "\n\n";
mat = mat * 0.5;
std::cout << mat << "\n";

This code has the following result:

[1, 0, 0, 0, 0, 0;
0, 0, 0, 1, 0, 0]

[0.5, 0, 0, 0, 0, 0;
0, 0, 0, 0.5, 0, 0]

but this code:

auto mat = cv::Mat::eye(2, 2, CV_32FC3);
std::cout << mat << "\n\n";
mat *= 0.5;
std::cout << mat << "\n";

This code has the following result:

[1, 0, 0, 0, 0, 0;
0, 0, 0, 1, 0, 0]

[1, 0, 0, 0, 0, 0;
0, 0, 0, 1, 0, 0]

means it has no effect on matrix. Any idea why? In addition why when I create a 3 channel (CV_32FC3) matrix with cv::Mat::eye, only first channel has values of 1 rather than all 3 channels?

2- why + only affect first channel?

Look at following code:

auto mat = cv::Mat::eye(2, 2, CV_32FC3);
std::cout << mat << "\n\n";
mat = mat + 0.5;
std::cout << mat << "\n";

This code has the following result:

[1, 0, 0, 0, 0, 0;
0, 0, 0, 1, 0, 0]

[1.5, 0, 0, 0.5, 0, 0;
0.5, 0, 0, 1.5, 0, 0]

why + only affect first channel rather than all channels? This happens while * affect all 3 channels. In addition, similar to *= case, += does not work too.

edit retag flag offensive close merge delete