Skip to content

Commit 49c08ae

Browse files
committed
Moving af_features to be an internal structure
- Added functions to access the individual parameters
1 parent 73146c4 commit 49c08ae

10 files changed

Lines changed: 293 additions & 143 deletions

File tree

include/af/features.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,7 @@
1010
#pragma once
1111
#include <af/defines.h>
1212

13-
typedef struct {
14-
size_t n;
15-
af_array x;
16-
af_array y;
17-
af_array score;
18-
af_array orientation;
19-
af_array size;
20-
} af_features;
13+
typedef void * af_features;
2114

2215
#ifdef __cplusplus
2316
namespace af
@@ -53,8 +46,24 @@ namespace af
5346
extern "C" {
5447
#endif
5548

49+
AFAPI af_err af_create_features(af_features *feat, dim_t num);
50+
51+
AFAPI af_err af_retain_features(af_features *out, const af_features feat);
52+
53+
AFAPI af_err af_get_features_num(dim_t *num, const af_features feat);
54+
55+
AFAPI af_err af_get_features_xpos(af_array *out, const af_features feat);
56+
57+
AFAPI af_err af_get_features_ypos(af_array *out, const af_features feat);
58+
59+
AFAPI af_err af_get_features_score(af_array *score, const af_features feat);
60+
61+
AFAPI af_err af_get_features_orientation(af_array *orientation, const af_features feat);
62+
63+
AFAPI af_err af_get_features_size(af_array *size, const af_features feat);
64+
5665
// Destroy af_features
57-
AFAPI af_err af_destroy_features(af_features feat);
66+
AFAPI af_err af_release_features(af_features feat);
5867

5968
#ifdef __cplusplus
6069
}

src/api/c/fast.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <handle.hpp>
1515
#include <err_common.hpp>
1616
#include <backend.hpp>
17+
#include <features.hpp>
1718
#include <fast.hpp>
1819

1920
using af::dim4;
@@ -28,7 +29,7 @@ static af_features fast(af_array const &in, const float thr,
2829
Array<float> y = createEmptyArray<float>(dim4());
2930
Array<float> score = createEmptyArray<float>(dim4());
3031

31-
af_features feat;
32+
af_features_t feat;
3233
feat.n = fast<T>(x, y, score,
3334
getArray<T>(in), thr,
3435
arc_length, non_max, feature_ratio, edge);
@@ -42,7 +43,7 @@ static af_features fast(af_array const &in, const float thr,
4243
feat.orientation = getHandle(orientation);
4344
feat.size = getHandle(size);
4445

45-
return feat;
46+
return getFeaturesHandle(feat);
4647
}
4748

4849

src/api/c/features.cpp

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99

1010
#include <af/features.h>
1111
#include <af/array.h>
12+
#include <features.hpp>
1213
#include <handle.hpp>
1314

14-
af_err af_destroy_features(af_features feat)
15+
af_err af_release_features(af_features featHandle)
1516
{
1617

1718
try {
19+
af_features_t feat = *(af_features_t *)featHandle;
1820
if (feat.n > 0) {
1921
if (feat.x != 0) AF_CHECK(af_release_array(feat.x));
2022
if (feat.y != 0) AF_CHECK(af_release_array(feat.y));
@@ -23,7 +25,122 @@ af_err af_destroy_features(af_features feat)
2325
if (feat.size != 0) AF_CHECK(af_release_array(feat.size));
2426
feat.n = 0;
2527
}
28+
delete (af_features_t *)featHandle;
2629
}
2730
CATCHALL;
2831
return AF_SUCCESS;
2932
}
33+
34+
af_features getFeaturesHandle(const af_features_t feat)
35+
{
36+
af_features_t *featHandle = new af_features_t;
37+
*featHandle = feat;
38+
return (af_features)featHandle;
39+
}
40+
41+
af_err af_create_features(af_features *featHandle, dim_t num)
42+
{
43+
try {
44+
af_features_t feat;
45+
feat.n = num;
46+
47+
if (num > 0) {
48+
dim_t out_dims[4] = {dim_t(num), 1, 1, 1};
49+
AF_CHECK(af_create_handle(&feat.x, 4, out_dims, f32));
50+
AF_CHECK(af_create_handle(&feat.y, 4, out_dims, f32));
51+
AF_CHECK(af_create_handle(&feat.score, 4, out_dims, f32));
52+
AF_CHECK(af_create_handle(&feat.orientation, 4, out_dims, f32));
53+
AF_CHECK(af_create_handle(&feat.size, 4, out_dims, f32));
54+
}
55+
56+
*featHandle = getFeaturesHandle(feat);
57+
} CATCHALL;
58+
59+
return AF_SUCCESS;
60+
}
61+
62+
af_features_t getFeatures(const af_features featHandle)
63+
{
64+
return *(af_features_t *)featHandle;
65+
}
66+
67+
af_err af_retain_features(af_features *outHandle, const af_features featHandle)
68+
{
69+
try {
70+
71+
af_features_t feat = getFeatures(featHandle);
72+
af_features_t out;
73+
74+
out.n = feat.n;
75+
AF_CHECK(af_retain_array(&out.x, feat.x));
76+
AF_CHECK(af_retain_array(&out.y, feat.y));
77+
AF_CHECK(af_retain_array(&out.score, feat.score));
78+
AF_CHECK(af_retain_array(&out.orientation, feat.orientation));
79+
AF_CHECK(af_retain_array(&out.size, feat.size));
80+
81+
*outHandle = getFeaturesHandle(out);
82+
83+
} CATCHALL;
84+
return AF_SUCCESS;
85+
}
86+
87+
af_err af_get_features_num(dim_t *num, const af_features featHandle)
88+
{
89+
try {
90+
91+
af_features_t feat = getFeatures(featHandle);
92+
*num = feat.n;
93+
94+
} CATCHALL;
95+
return AF_SUCCESS;
96+
}
97+
98+
af_err af_get_features_xpos(af_array *out, const af_features featHandle)
99+
{
100+
try {
101+
102+
af_features_t feat = getFeatures(featHandle);
103+
*out = feat.x;
104+
} CATCHALL;
105+
return AF_SUCCESS;
106+
}
107+
108+
af_err af_get_features_ypos(af_array *out, const af_features featHandle)
109+
{
110+
try {
111+
112+
af_features_t feat = getFeatures(featHandle);
113+
*out = feat.y;
114+
} CATCHALL;
115+
return AF_SUCCESS;
116+
}
117+
118+
af_err af_get_features_score(af_array *out, const af_features featHandle)
119+
{
120+
try {
121+
122+
af_features_t feat = getFeatures(featHandle);
123+
*out = feat.score;
124+
} CATCHALL;
125+
return AF_SUCCESS;
126+
}
127+
128+
af_err af_get_features_orientation(af_array *out, const af_features featHandle)
129+
{
130+
try {
131+
132+
af_features_t feat = getFeatures(featHandle);
133+
*out = feat.orientation;
134+
} CATCHALL;
135+
return AF_SUCCESS;
136+
}
137+
138+
af_err af_get_features_size(af_array *out, const af_features featHandle)
139+
{
140+
try {
141+
142+
af_features_t feat = getFeatures(featHandle);
143+
*out = feat.size;
144+
} CATCHALL;
145+
return AF_SUCCESS;
146+
}

src/api/c/features.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
typedef struct {
4+
size_t n;
5+
af_array x;
6+
af_array y;
7+
af_array score;
8+
af_array orientation;
9+
af_array size;
10+
} af_features_t;
11+
12+
af_features getFeaturesHandle(const af_features_t feat);
13+
14+
af_features_t getFeatures(const af_features featHandle);

src/api/c/orb.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@
1515
#include <err_common.hpp>
1616
#include <backend.hpp>
1717
#include <orb.hpp>
18+
#include <features.hpp>
1819

1920
using af::dim4;
2021
using namespace detail;
2122

2223
template<typename T, typename convAccT>
23-
static void orb(af_features& feat, af_array& descriptor,
24+
static void orb(af_features& feat_, af_array& descriptor,
2425
const af_array& in, const float fast_thr,
2526
const unsigned max_feat, const float scl_fctr,
2627
const unsigned levels, const bool blur_img)
@@ -32,6 +33,8 @@ static void orb(af_features& feat, af_array& descriptor,
3233
Array<float> size = createEmptyArray<float>(dim4());
3334
Array<uint > desc = createEmptyArray<uint >(dim4());
3435

36+
af_features_t feat;
37+
3538
feat.n = orb<T, convAccT>(x, y, score, ori, size, desc,
3639
getArray<T>(in), fast_thr, max_feat,
3740
scl_fctr, levels, blur_img);
@@ -42,6 +45,7 @@ static void orb(af_features& feat, af_array& descriptor,
4245
feat.orientation = getHandle(ori);
4346
feat.size = getHandle(size);
4447

48+
feat_ = getFeaturesHandle(feat);
4549
descriptor = getHandle<unsigned>(desc);
4650
}
4751

src/api/cpp/features.cpp

Lines changed: 24 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,12 @@ namespace af
1717

1818
features::features()
1919
{
20-
feat.n = 0;
21-
feat.x = 0;
22-
feat.y = 0;
23-
feat.score = 0;
24-
feat.orientation = 0;
25-
feat.size = 0;
20+
AF_THROW(af_create_features(&feat, 0));
2621
}
2722

2823
features::features(const size_t n)
2924
{
30-
feat.n = n;
31-
dim_t out_dims[4] = {dim_t(n), 1, 1, 1};
32-
AF_THROW(af_create_handle(&feat.x, 4, out_dims, f32));
33-
AF_THROW(af_create_handle(&feat.y, 4, out_dims, f32));
34-
AF_THROW(af_create_handle(&feat.score, 4, out_dims, f32));
35-
AF_THROW(af_create_handle(&feat.orientation, 4, out_dims, f32));
36-
AF_THROW(af_create_handle(&feat.size, 4, out_dims, f32));
25+
AF_THROW(af_create_features(&feat, (int)n));
3726
}
3827

3928
features::features(af_features f) : feat(f)
@@ -43,83 +32,68 @@ namespace af
4332
features& features::operator= (const features& other)
4433
{
4534
if (this != &other) {
46-
47-
if (feat.n > 0) {
48-
AF_THROW(af_destroy_features(feat));
49-
}
50-
51-
af_features f = other.get();
52-
53-
feat.n = f.n;
54-
if (f.n > 0) {
55-
AF_THROW(af_retain_array(&feat.x, f.x));
56-
AF_THROW(af_retain_array(&feat.y, f.y));
57-
AF_THROW(af_retain_array(&feat.score, f.score));
58-
AF_THROW(af_retain_array(&feat.orientation, f.orientation));
59-
AF_THROW(af_retain_array(&feat.size, f.size));
60-
} else {
61-
feat.x = 0;
62-
feat.y = 0;
63-
feat.score = 0;
64-
feat.orientation = 0;
65-
feat.size = 0;
66-
}
35+
AF_THROW(af_release_features(feat));
36+
AF_THROW(af_retain_features(&feat, other.get()));
6737
}
68-
6938
return *this;
7039
}
7140

7241
features::~features()
7342
{
74-
if (feat.n > 0) {
75-
if(AF_SUCCESS != af_destroy_features(feat)) {
76-
fprintf(stderr, "Error: Couldn't destroy af::features: %p\n", this);
77-
}
43+
if(AF_SUCCESS != af_release_features(feat)) {
44+
fprintf(stderr, "Error: Couldn't release af::features: %p\n", this);
7845
}
7946
}
8047

8148
size_t features::getNumFeatures() const
8249
{
83-
return feat.n;
50+
dim_t n = 0;
51+
AF_THROW(af_get_features_num(&n, feat));
52+
return n;
8453
}
8554

8655
array features::getX() const
8756
{
88-
if (feat.n == 0) return array();
57+
af_array x = 0;
58+
AF_THROW(af_get_features_xpos(&x, feat));
8959
af_array tmp = 0;
90-
AF_THROW(af_retain_array(&tmp, feat.x));
60+
AF_THROW(af_retain_array(&tmp, x));
9161
return array(tmp);
9262
}
9363

9464
array features::getY() const
9565
{
96-
if (feat.n == 0) return array();
66+
af_array y = 0;
67+
AF_THROW(af_get_features_ypos(&y, feat));
9768
af_array tmp = 0;
98-
AF_THROW(af_retain_array(&tmp, feat.y));
69+
AF_THROW(af_retain_array(&tmp, y));
9970
return array(tmp);
10071
}
10172

10273
array features::getScore() const
10374
{
104-
if (feat.n == 0) return array();
75+
af_array s = 0;
76+
AF_THROW(af_get_features_score(&s, feat));
10577
af_array tmp = 0;
106-
AF_THROW(af_retain_array(&tmp, feat.score));
78+
AF_THROW(af_retain_array(&tmp, s));
10779
return array(tmp);
10880
}
10981

11082
array features::getOrientation() const
11183
{
112-
if (feat.n == 0) return array();
84+
af_array ori = 0;
85+
AF_THROW(af_get_features_orientation(&ori, feat));
11386
af_array tmp = 0;
114-
AF_THROW(af_retain_array(&tmp, feat.orientation));
87+
AF_THROW(af_retain_array(&tmp, ori));
11588
return array(tmp);
11689
}
11790

11891
array features::getSize() const
11992
{
120-
if (feat.n == 0) return array();
93+
af_array s = 0;
94+
AF_THROW(af_get_features_size(&s, feat));
12195
af_array tmp = 0;
122-
AF_THROW(af_retain_array(&tmp, feat.size));
96+
AF_THROW(af_retain_array(&tmp, s));
12397
return array(tmp);
12498
}
12599

src/api/cpp/orb.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ void orb(features& feat, array& desc, const array& in,
2323
af_array temp_desc = 0;
2424
AF_THROW(af_orb(&temp_feat, &temp_desc, in.get(), fast_thr,
2525
max_feat, scl_fctr, levels, blur_img));
26+
27+
dim_t num = 0;
28+
AF_THROW(af_get_features_num(&num, temp_feat));
2629
feat = features(temp_feat);
2730
desc = array(temp_desc);
2831
}

0 commit comments

Comments
 (0)