- To get the same results from PC and Android platforms with the same source codes.
- For matrix inverse function, that is inv(), there are many options namely DECOMP_SVD, DECOMP_EIG, DECOMP_LU and DECOMP_CHOLESKY.

If you want the inversion result of PC and that of Android to be the same, you should use either DECOMP_SVD or DECOMP_EIG.

However the results of DECOMP_SVD and DECOMP_EIG are also different for the same input. For my work, DECOMP_SVD seems to give better result than DECOMP_EIG.

For the issue of speed, I checked the processing times for DECOMP_LU, DECOMP_SVD and DECOMP_EIG and found there is no such a difference in their running times. - For arc-tangent, there is a OpenCV function fastAtan2().

If you want the arc-tangent return values of PC and Android to be the same, you should use fastAtan2() instead of atan2() of “math.h”

For the issue of speed, I checked the speeds of atan2() and fastAtan2() and got strange results. In Debug mode, fastAtan2() is faster than atan2() as the name implies. In Release mode, however, atan2() is much faster than fastAtan2() and it took almost 0 millisecond for processing atan2(). (I might have done something wrong) - For random number generation, there are functions rand() and srand() of “stdlib.h”. OpenCV also provides random number generator class cv::RNG.

Sometimes you have to compare the (intermediate) results of PC and Android version of the same source codes so that you should remove the randomness in your codes. In other words, if you want for the sequences of generated random numbers from PC and Android to be fixed and the same, you should use cv::RNG with a fixed seed such as RNG(1234567) instead of rand() of “stdlib.h”. Even if you give a fixed seed to srand() such as in srand(1234567), it will give you different fixed random sequences for PC and Android. In fact, this will give the same random sequence every run for PC. And it will do so for Android. However, the sequences for PC and Android will not be the same. To get the same fixed random sequence with the same source codes, you should use cv::RNG as in the following example.cv::RNG rng = RNG(12378213); float randomF = rng.uniform(5.f, 45.f); int randomI = rng.uniform(5, 45); double randomD = rng.uniform((double)5, (double)45);

In addition, there are some OpenCV functions such as cv::solvePnPRansac() which use random number generator internally. If you want such a random function to give the fixed and same results in every run, you should give a fixed seed such as in following.

theRNG().state = 1234567; cv::solvePnPRansac(blah, blah, blah, ...);

- For matrix inverse function, that is inv(), there are many options namely DECOMP_SVD, DECOMP_EIG, DECOMP_LU and DECOMP_CHOLESKY.
- About reading gray image file.

There are many options for the funtion cv::imread(), namely

IMREAD_UNCHANGED =-1,

IMREAD_GRAYSCALE =0,

IMREAD_COLOR =1,

IMREAD_ANYDEPTH =2,

IMREAD_ANYCOLOR =4

and the default is IMREAD_COLOR.

If you read a gray image file with the default option IMREAD_COLOR, the resulted Mat (say matCOLOR) has 3 channels as a color image. If you split matCOLOR into 3 channels(red, green and blue) with the function cv::split(), the resulted blue, green and red matrices (say matBlueFromCOLOR, matGreenFromCOLOR and matRedFromCOLOR respectively) are all identical. If you convert matCOLOR to a gray image (say matGrayFromCOLOR) using cv::cvtColor(CV_BGR2GRAY), matGrayFromCOLOR is also identical to the blue, green and red matrices.

If you read the gray image file with the option IMREAD_GRAYSCALE or IMREAD_UNCHANGED, the resulted Mat (say matGRAYSCALE or matUNCHANGED respectively) is also identical to the converted Mat matGrayFromCOLOR.

In short, for a gray image file, the following Mats are all identical.

matBlueFromCOLOR, matGreenFromCOLOR, matRedFromCOLOR,

matGRAYSCALE, matUNCHANGED, matGrayFromCOLOR

Advertisements