#include <stdio.h>
#include "oal_aloc.h"
#include "fie.h"
FHANDLE fnSMP_img_to_region(FHANDLE himg, DPNT_T point)
{
FHANDLE hreg = NULL;
F_EDGE_SOBEL_PARAMS params;
UINT feat_mode = F_EDGE_FEAT_DIRECT;
INT border_mode = F_BORDER_NONE;
DPNT_T offset = { 0,0 } ;
F_DEDGE* edges = NULL;
INT edge_num = 0;
INT index[1] = { 0 };
DOUBLE angle_range = 0.8 * PI;
INT distance_range = 2;
INT min_clust_elem = 2;
INT max_clust_elem = -1;
F_EDGE_CLUST* edge_clust = NULL;
INT clust_num = 0;
F_DEDGE* dst_edges = NULL;
INT dst_edge_num = 0;
PNT_T* out_point = NULL;
INT num_dst = 0;
DOUBLE threshold = 10;
PNT_T* point_cloud1 = NULL;
DPNT_T* point_cloud2 = NULL;
INT i = 0;
INT c_num = 0;
INT result;
params.mag_threshold = 30;
params.nms_length = 1;
fnFIE_edge_sobel_subpix(himg, NULL, ¶ms, feat_mode, border_mode, offset, &edges, &edge_num);
fnFIE_edge_connecting2(edges, edge_num, angle_range, distance_range, min_clust_elem, max_clust_elem, &edge_clust, &clust_num);
for (c_num = 0; c_num < clust_num; c_num++)
{
index[0] = c_num;
fnFIE_refilter_edge_by_clust(edges, edge_num, edge_clust, clust_num, index, 1, &dst_edges, &dst_edge_num);
point_cloud1 = fnOAL_malloc(dst_edge_num * (sizeof(PNT_T)));
out_point = fnOAL_malloc(dst_edge_num * (sizeof(PNT_T)));
for (i = 0; i < dst_edge_num; i++) {
point_cloud1[i].x = fnFIE_d4i5(dst_edges[i].x);
point_cloud1[i].y = fnFIE_d4i5(dst_edges[i].y);
}
fnFIE_cg_vectorize2d_dp(point_cloud1, dst_edge_num, out_point, NULL, &num_dst, threshold);
point_cloud2 = fnOAL_malloc(num_dst * (sizeof(DPNT_T)));
for (i = 0; i < num_dst; i++) {
point_cloud2[i].x = (DOUBLE)out_point[i].x;
point_cloud2[i].y = (DOUBLE)out_point[i].y;
}
hreg = fnFIE_create_region_polygon(point_cloud2, num_dst);
fnFIE_region_includes_xy(hreg, point.x, point.y, &result);
fnOAL_free(dst_edges); dst_edges = NULL;
fnOAL_free(point_cloud1); point_cloud1 = NULL;
fnOAL_free(out_point); out_point = NULL;
fnOAL_free(point_cloud2); point_cloud2 = NULL;
if (result == 0) { fnFIE_free_object(hreg); hreg = NULL; }
else break;
}
fnOAL_free(dst_edges);
fnOAL_free(point_cloud1);
fnOAL_free(out_point);
fnOAL_free(point_cloud2);
fnOAL_free(edges);
fnFIE_free_edge_clust(edge_clust, clust_num);
return hreg;
}
INT main() {
FHANDLE himg = NULL;
FHANDLE hreg = NULL;
FHANDLE hresult = NULL;
DPNT_T point = { 155.0,253.0 };
PNT_T offset = { 0,0 };
INT width, height;
fnFIE_setup();
fnFIE_load_bmp("gray_05.bmp", &himg, F_COLOR_IMG_TYPE_UC8);
fnFIE_img_get_params(himg, NULL, NULL, NULL, &width, &height);
hresult = fnFIE_img_root_alloc(F_IMG_BIN, 1, width, height);
fnFIE_img_clear(hresult, 1);
hreg = fnSMP_img_to_region(himg, point);
fnFIE_region_decode(hreg, hresult, offset, 0);
fnFIE_save_bmp("result.bmp", hresult);
fnFIE_free_object(himg);
fnFIE_free_object(hreg);
fnFIE_free_object(hresult);
fnFIE_teardown();
return 0;
}