[arrayfire] 79/408: Added Harris corner detector unit tests
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Mon Sep 21 19:11:21 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to branch debian/sid
in repository arrayfire.
commit cef733bc61406cc3b51e290a5c1762ad449c4a3a
Author: Peter Andreas Entschev <peter at arrayfire.com>
Date: Thu Jul 2 13:39:25 2015 -0400
Added Harris corner detector unit tests
---
test/harris.cpp | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 212 insertions(+)
diff --git a/test/harris.cpp b/test/harris.cpp
new file mode 100644
index 0000000..b964e89
--- /dev/null
+++ b/test/harris.cpp
@@ -0,0 +1,212 @@
+/*******************************************************
+ * Copyright (c) 2015, ArrayFire
+ * All rights reserved.
+ *
+ * This file is distributed under 3-clause BSD license.
+ * The complete license agreement can be obtained at:
+ * http://arrayfire.com/licenses/BSD-3-Clause
+ ********************************************************/
+
+#include <gtest/gtest.h>
+#include <arrayfire.h>
+#include <af/dim4.hpp>
+#include <af/traits.hpp>
+#include <af/compatible.h>
+#include <string>
+#include <vector>
+#include <cmath>
+#include <testHelpers.hpp>
+#include <typeinfo>
+
+using std::string;
+using std::vector;
+using af::dim4;
+
+typedef struct
+{
+ float f[5];
+} feat_t;
+
+bool feat_cmp(feat_t i, feat_t j)
+{
+ for (int k = 0; k < 5; k++)
+ if (i.f[k] != j.f[k])
+ return (i.f[k] < j.f[k]);
+
+ return false;
+}
+
+void array_to_feat(vector<feat_t>& feat, float *x, float *y, float *score, float *orientation, float *size, unsigned nfeat)
+{
+ feat.resize(nfeat);
+ for (unsigned i = 0; i < feat.size(); i++) {
+ feat[i].f[0] = x[i];
+ feat[i].f[1] = y[i];
+ feat[i].f[2] = score[i];
+ feat[i].f[3] = orientation[i];
+ feat[i].f[4] = size[i];
+ }
+}
+
+template<typename T>
+class Harris : public ::testing::Test
+{
+ public:
+ virtual void SetUp() {}
+};
+
+typedef ::testing::Types<float, double> TestTypes;
+
+TYPED_TEST_CASE(Harris, TestTypes);
+
+template<typename T>
+void harrisTest(string pTestFile, float sigma, unsigned block_size)
+{
+ if (noDoubleTests<T>()) return;
+
+ vector<dim4> inDims;
+ vector<string> inFiles;
+ vector<vector<float> > gold;
+
+ readImageTests(pTestFile, inDims, inFiles, gold);
+
+ size_t testCount = inDims.size();
+
+ for (size_t testId=0; testId<testCount; ++testId) {
+ dim_t nElems = 0;
+ af_array inArray_f32 = 0;
+ af_array inArray = 0;
+ af_features out;
+
+ inFiles[testId].insert(0,string(TEST_DIR"/harris/"));
+
+ ASSERT_EQ(AF_SUCCESS, af_load_image(&inArray_f32, inFiles[testId].c_str(), false));
+
+ ASSERT_EQ(AF_SUCCESS, conv_image<T>(&inArray, inArray_f32));
+
+ ASSERT_EQ(AF_SUCCESS, af_harris(&out, inArray, 500, 1e5f, sigma, block_size, 0.04f));
+
+ dim_t n = 0;
+ af_array x, y, score, orientation, size;
+
+ ASSERT_EQ(AF_SUCCESS, af_get_features_num(&n, out));
+ ASSERT_EQ(AF_SUCCESS, af_get_features_xpos(&x, out));
+ ASSERT_EQ(AF_SUCCESS, af_get_features_ypos(&y, out));
+ ASSERT_EQ(AF_SUCCESS, af_get_features_score(&score, out));
+ ASSERT_EQ(AF_SUCCESS, af_get_features_orientation(&orientation, out));
+ ASSERT_EQ(AF_SUCCESS, af_get_features_size(&size, out));
+
+
+ ASSERT_EQ(AF_SUCCESS, af_get_elements(&nElems, x));
+
+ float * outX = new float[gold[0].size()];
+ float * outY = new float[gold[1].size()];
+ float * outScore = new float[gold[2].size()];
+ float * outOrientation = new float[gold[3].size()];
+ float * outSize = new float[gold[4].size()];
+ ASSERT_EQ(AF_SUCCESS, af_get_data_ptr((void*)outX, x));
+ ASSERT_EQ(AF_SUCCESS, af_get_data_ptr((void*)outY, y));
+ ASSERT_EQ(AF_SUCCESS, af_get_data_ptr((void*)outScore, score));
+ ASSERT_EQ(AF_SUCCESS, af_get_data_ptr((void*)outOrientation, orientation));
+ ASSERT_EQ(AF_SUCCESS, af_get_data_ptr((void*)outSize, size));
+
+ vector<feat_t> out_feat;
+ array_to_feat(out_feat, outX, outY, outScore, outOrientation, outSize, n);
+
+ vector<feat_t> gold_feat;
+ array_to_feat(gold_feat, &gold[0].front(), &gold[1].front(), &gold[2].front(), &gold[3].front(), &gold[4].front(), gold[0].size());
+
+ std::sort(out_feat.begin(), out_feat.end(), feat_cmp);
+ std::sort(gold_feat.begin(), gold_feat.end(), feat_cmp);
+
+ for (int elIter = 0; elIter < (int)nElems; elIter++) {
+ ASSERT_EQ(out_feat[elIter].f[0], gold_feat[elIter].f[0]) << "at: " << elIter << std::endl;
+ ASSERT_EQ(out_feat[elIter].f[1], gold_feat[elIter].f[1]) << "at: " << elIter << std::endl;
+ ASSERT_LE(fabs(out_feat[elIter].f[2] - gold_feat[elIter].f[2]), 1e2) << "at: " << elIter << std::endl;
+ ASSERT_EQ(out_feat[elIter].f[3], gold_feat[elIter].f[3]) << "at: " << elIter << std::endl;
+ ASSERT_EQ(out_feat[elIter].f[4], gold_feat[elIter].f[4]) << "at: " << elIter << std::endl;
+ }
+
+ ASSERT_EQ(AF_SUCCESS, af_release_array(inArray));
+ ASSERT_EQ(AF_SUCCESS, af_release_array(inArray_f32));
+
+ ASSERT_EQ(AF_SUCCESS, af_release_array(x));
+ ASSERT_EQ(AF_SUCCESS, af_release_array(y));
+ ASSERT_EQ(AF_SUCCESS, af_release_array(score));
+ ASSERT_EQ(AF_SUCCESS, af_release_array(orientation));
+ ASSERT_EQ(AF_SUCCESS, af_release_array(size));
+
+ delete [] outX;
+ delete [] outY;
+ delete [] outScore;
+ delete [] outOrientation;
+ delete [] outSize;
+ }
+}
+
+#define HARRIS_INIT(desc, image, sigma, block_size) \
+ TYPED_TEST(Harris, desc) \
+ { \
+ harrisTest<TypeParam>(string(TEST_DIR"/harris/"#image"_"#sigma"_"#block_size".test"), sigma, block_size); \
+ }
+
+ HARRIS_INIT(square_0_3, square, 0, 3);
+ HARRIS_INIT(square_0_7, square, 0, 7);
+ HARRIS_INIT(square_1_0, square, 1, 0);
+ HARRIS_INIT(square_5_0, square, 5, 0);
+ HARRIS_INIT(lena_0_3, lena, 0, 3);
+ HARRIS_INIT(lena_0_7, lena, 0, 7);
+ HARRIS_INIT(lena_1_0, lena, 1, 0);
+ HARRIS_INIT(lena_5_0, lena, 5, 0);
+
+/////////////////////////////////// CPP ////////////////////////////////
+
+TEST(FloatHarris, CPP)
+{
+ if (noDoubleTests<float>()) return;
+
+ vector<dim4> inDims;
+ vector<string> inFiles;
+ vector<vector<float> > gold;
+
+ readImageTests(string(TEST_DIR"/harris/square_0_3.test"), inDims, inFiles, gold);
+ inFiles[0].insert(0,string(TEST_DIR"/harris/"));
+
+ af::array in = af::loadImage(inFiles[0].c_str(), false);
+
+ af::features out = harris(in, 500, 1e5f, 0.0f, 3, 0.04f);
+
+ float * outX = new float[gold[0].size()];
+ float * outY = new float[gold[1].size()];
+ float * outScore = new float[gold[2].size()];
+ float * outOrientation = new float[gold[3].size()];
+ float * outSize = new float[gold[4].size()];
+ out.getX().host(outX);
+ out.getY().host(outY);
+ out.getScore().host(outScore);
+ out.getOrientation().host(outOrientation);
+ out.getSize().host(outSize);
+
+ vector<feat_t> out_feat;
+ array_to_feat(out_feat, outX, outY, outScore, outOrientation, outSize, out.getNumFeatures());
+
+ vector<feat_t> gold_feat;
+ array_to_feat(gold_feat, &gold[0].front(), &gold[1].front(), &gold[2].front(), &gold[3].front(), &gold[4].front(), gold[0].size());
+
+ std::sort(out_feat.begin(), out_feat.end(), feat_cmp);
+ std::sort(gold_feat.begin(), gold_feat.end(), feat_cmp);
+
+ for (unsigned elIter = 0; elIter < out.getNumFeatures(); elIter++) {
+ ASSERT_EQ(out_feat[elIter].f[0], gold_feat[elIter].f[0]) << "at: " << elIter << std::endl;
+ ASSERT_EQ(out_feat[elIter].f[1], gold_feat[elIter].f[1]) << "at: " << elIter << std::endl;
+ ASSERT_LE(fabs(out_feat[elIter].f[2] - gold_feat[elIter].f[2]), 1e2) << "at: " << elIter << std::endl;
+ ASSERT_EQ(out_feat[elIter].f[3], gold_feat[elIter].f[3]) << "at: " << elIter << std::endl;
+ ASSERT_EQ(out_feat[elIter].f[4], gold_feat[elIter].f[4]) << "at: " << elIter << std::endl;
+ }
+
+ delete[] outX;
+ delete[] outY;
+ delete[] outScore;
+ delete[] outOrientation;
+ delete[] outSize;
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/arrayfire.git
More information about the debian-science-commits
mailing list