Image-CCV
view release on metacpan or search on metacpan
ccv-src/lib/ccv_sift.c view on Meta::CPAN
}
ccv_array_t* keypoints = *_keypoints;
int custom_keypoints = 0;
if (keypoints == 0)
keypoints = *_keypoints = ccv_array_new(sizeof(ccv_keypoint_t), 10, 0);
else
custom_keypoints = 1;
int i, j, k, x, y;
double sigma0 = 1.6;
double sigmak = pow(2.0, 1.0 / (params.nlevels - 3));
double dsigma0 = sigma0 * sigmak * sqrt(1.0 - 1.0 / (sigmak * sigmak));
if (params.up2x)
{
ccv_sample_up(a, &g[-(params.nlevels + 1)], 0, 0, 0);
/* since there is a gaussian filter in sample_up function already,
* the default sigma for upsampled image is sqrt(2) */
double sd = sqrt(sigma0 * sigma0 - 2.0);
ccv_blur(g[-(params.nlevels + 1)], &g[-(params.nlevels + 1) + 1], CCV_32F | CCV_C1, sd);
ccv_matrix_free(g[-(params.nlevels + 1)]);
for (j = 1; j < params.nlevels; j++)
{
sd = dsigma0 * pow(sigmak, j - 1);
ccv_blur(g[-(params.nlevels + 1) + j], &g[-(params.nlevels + 1) + j + 1], 0, sd);
ccv_subtract(g[-(params.nlevels + 1) + j + 1], g[-(params.nlevels + 1) + j], (ccv_matrix_t**)&dog[-(params.nlevels - 1) + j - 1], 0);
if (j > 1 && j < params.nlevels - 1)
ccv_gradient(g[-(params.nlevels + 1) + j], &th[-(params.nlevels - 3) + j - 2], 0, &md[-(params.nlevels - 3) + j - 2], 0, 1, 1);
ccv_matrix_free(g[-(params.nlevels + 1) + j]);
}
ccv_matrix_free(g[-1]);
}
double sd = sqrt(sigma0 * sigma0 - 0.25);
g[0] = a;
/* generate gaussian pyramid (g, dog) & gradient pyramid (th, md) */
ccv_blur(g[0], &g[1], CCV_32F | CCV_C1, sd);
for (j = 1; j < params.nlevels; j++)
{
sd = dsigma0 * pow(sigmak, j - 1);
ccv_blur(g[j], &g[j + 1], 0, sd);
ccv_subtract(g[j + 1], g[j], (ccv_matrix_t**)&dog[j - 1], 0);
if (j > 1 && j < params.nlevels - 1)
ccv_gradient(g[j], &th[j - 2], 0, &md[j - 2], 0, 1, 1);
ccv_matrix_free(g[j]);
}
ccv_matrix_free(g[params.nlevels]);
for (i = 1; i < params.noctaves; i++)
{
ccv_sample_down(g[(i - 1) * (params.nlevels + 1)], &g[i * (params.nlevels + 1)], 0, 0, 0);
if (i - 1 > 0)
ccv_matrix_free(g[(i - 1) * (params.nlevels + 1)]);
sd = sqrt(sigma0 * sigma0 - 0.25);
ccv_blur(g[i * (params.nlevels + 1)], &g[i * (params.nlevels + 1) + 1], CCV_32F | CCV_C1, sd);
for (j = 1; j < params.nlevels; j++)
{
sd = dsigma0 * pow(sigmak, j - 1);
ccv_blur(g[i * (params.nlevels + 1) + j], &g[i * (params.nlevels + 1) + j + 1], 0, sd);
ccv_subtract(g[i * (params.nlevels + 1) + j + 1], g[i * (params.nlevels + 1) + j], (ccv_matrix_t**)&dog[i * (params.nlevels - 1) + j - 1], 0);
if (j > 1 && j < params.nlevels - 1)
ccv_gradient(g[i * (params.nlevels + 1) + j], &th[i * (params.nlevels - 3) + j - 2], 0, &md[i * (params.nlevels - 3) + j - 2], 0, 1, 1);
ccv_matrix_free(g[i * (params.nlevels + 1) + j]);
}
ccv_matrix_free(g[i * (params.nlevels + 1) + params.nlevels]);
}
ccv_matrix_free(g[(params.noctaves - 1) * (params.nlevels + 1)]);
if (!custom_keypoints)
( run in 1.719 second using v1.01-cache-2.11-cpan-71847e10f99 )