Image-CCV
view release on metacpan or search on metacpan
double d = 0;
for (k = 0; k < 128; k++)
{
d += (odesc[k] - idesc[k]) * (odesc[k] - idesc[k]);
if (d > mind2)
break;
}
if (d < mind)
{
mind2 = mind;
mind = d;
minj = j;
} else if (d < mind2) {
mind2 = d;
}
}
if (mind < mind2 * 0.36)
{
ccv_keypoint_t* op = (ccv_keypoint_t*)ccv_array_get(obj_keypoints, i);
ccv_keypoint_t* kp = (ccv_keypoint_t*)ccv_array_get(image_keypoints, minj);
// Create the new 4-item array
AV* res = newAV();
av_push( res, newSVnv( op->x ));
av_push( res, newSVnv( op->y ));
av_push( res, newSVnv( kp->x ));
av_push( res, newSVnv( kp->y ));
Inline_Stack_Push(sv_2mortal(newRV_noinc((SV*) res)));
match++;
}
}
ccv_array_free(obj_keypoints);
ccv_array_free(image_keypoints);
ccv_matrix_free(obj_desc);
ccv_matrix_free(image_desc);
ccv_matrix_free(object);
ccv_matrix_free(image);
ccv_disable_cache();
Inline_Stack_Done;
return;
}
// 3
MODULE = Image::CCV PACKAGE = Image::CCV
PROTOTYPES: DISABLE
void
myccv_detect_faces (filename, training_data)
char * filename
char * training_data
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
Inline_Stack_Vars;
Inline_Stack_Reset;
int i;
ccv_enable_default_cache();
ccv_dense_matrix_t* image = 0;
/* TODO: Make the cascade accessible from the outside */
ccv_bbf_classifier_cascade_t* cascade = ccv_bbf_read_classifier_cascade(training_data);
ccv_read(filename, &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
if (image != 0)
{
/* TODO: Make the BBF parameters accessible from the outside */
ccv_bbf_param_t params = { .interval = 5, .min_neighbors = 2, .accurate = 1, .flags = 0, .size = ccv_size(24, 24) };
ccv_array_t* seq = ccv_bbf_detect_objects(image, &cascade, 1, params);
for (i = 0; i < seq->rnum; i++)
{
ccv_comp_t* comp = (ccv_comp_t*)ccv_array_get(seq, i);
/* Create the new 5-item array */
AV* res = newAV();
av_push( res, newSVnv( comp->rect.x ));
av_push( res, newSVnv( comp->rect.y ));
av_push( res, newSVnv( comp->rect.width ));
av_push( res, newSVnv( comp->rect.height ));
av_push( res, newSVnv( comp->classification.confidence ));
Inline_Stack_Push(sv_2mortal(newRV_noinc((SV*) res)));
}
ccv_array_free(seq);
ccv_matrix_free(image);
}
ccv_bbf_classifier_cascade_free(cascade);
ccv_disable_cache();
Inline_Stack_Done;
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
ccv_sift_param_t *
myccv_pack_parameters (noctaves, nlevels, up2x, edge_threshold, norm_threshold, peak_threshold)
int noctaves
int nlevels
int up2x
int edge_threshold
int norm_threshold
int peak_threshold
void
myccv_keypoints_to_list (keypoints)
ccv_array_t * keypoints
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
myccv_keypoints_to_list(keypoints);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
void
myccv_get_descriptor (file, param)
char * file
ccv_sift_param_t * param
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
myccv_get_descriptor(file, param);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
void
myccv_sift (object_file, scene_file, param)
char * object_file
char * scene_file
ccv_sift_param_t * param
PREINIT:
I32* temp;
PPCODE:
( run in 1.958 second using v1.01-cache-2.11-cpan-39bf76dae61 )