| 530 | } |
| 531 | |
| 532 | void GetCovarianceVector(CGV_FLOAT covariance_out[MAX_CHANNELS * MAX_CHANNELS], // OUT: Covariance vector |
| 533 | CGV_FLOAT image_centered[SOURCE_BLOCK_SIZE * MAX_CHANNELS], |
| 534 | CGV_INT numEntries, // < 16 |
| 535 | CGU_UINT8 channels3or4) |
| 536 | { // IN: 3 = RGB or 4 = RGBA (4 = MAX_CHANNELS) |
| 537 | for (CGU_UINT8 ch1 = 0; ch1 < channels3or4; ch1++) |
| 538 | for (CGU_UINT8 ch2 = 0; ch2 <= ch1; ch2++) |
| 539 | { |
| 540 | covariance_out[ch1 + ch2 * 4] = 0; |
| 541 | for (CGV_INT k = 0; k < numEntries; k++) |
| 542 | covariance_out[ch1 + ch2 * 4] += image_centered[k + (ch1 * SOURCE_BLOCK_SIZE)] * image_centered[k + (ch2 * SOURCE_BLOCK_SIZE)]; |
| 543 | } |
| 544 | |
| 545 | for (CGU_UINT8 ch1 = 0; ch1 < channels3or4; ch1++) |
| 546 | for (CGU_UINT8 ch2 = ch1 + 1; ch2 < channels3or4; ch2++) |
| 547 | covariance_out[ch1 + ch2 * 4] = covariance_out[ch2 + ch1 * 4]; |
| 548 | } |
| 549 | |
| 550 | void GetProjecedImage(CGV_FLOAT projection_out[SOURCE_BLOCK_SIZE], //output projected data |
| 551 | CGV_FLOAT image_centered[SOURCE_BLOCK_SIZE * MAX_CHANNELS], |