From 562fe0fcedace39735ead089cfdc4e2b07e40aad Mon Sep 17 00:00:00 2001 From: Abe Mbise Date: Fri, 9 Feb 2018 14:13:02 +0000 Subject: COMPMID-578: Faster common keypoint validation routine for FAST and Harris corners Change-Id: I1f3038ccfa6be5e0a19bec11a89af5ed2247c42f Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/119936 Reviewed-by: Anthony Barbier Reviewed-by: Georgios Pinitas Tested-by: Jenkins --- tests/AssetsLibrary.cpp | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'tests/AssetsLibrary.cpp') diff --git a/tests/AssetsLibrary.cpp b/tests/AssetsLibrary.cpp index f5eac8a59a..1cbd3b4e3d 100644 --- a/tests/AssetsLibrary.cpp +++ b/tests/AssetsLibrary.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -48,19 +48,26 @@ namespace template ::value, int>::type = 0> void rgb_to_luminance(const RawTensor &src, RawTensor &dst) { - const size_t min_size = std::min(src.size(), dst.size()); + // Ensure in/out tensors have same image dimensions (independent of element size and number of channels) + ARM_COMPUTE_ERROR_ON_MSG(src.num_elements() != dst.num_elements(), "Input and output images must have equal dimensions"); - for(size_t i = 0, j = 0; i < min_size; i += 3, ++j) + const size_t num_elements = dst.num_elements(); + + // Currently, input is always RGB888 (3 U8 channels per element). Output can be U8, U16/S16 or U32 + // Note that src.data()[i] returns pointer to first channel of element[i], so RGB values have [0,1,2] offsets + for(size_t i = 0, j = 0; j < num_elements; i += 3, ++j) { - reinterpret_cast(dst.data())[j] = 0.2126f * src.data()[i + 0] + 0.7152f * src.data()[i + 1] + 0.0722f * src.data()[i + 2]; + reinterpret_cast(dst.data())[j] = 0.2126f * src.data()[i] + 0.7152f * src.data()[i + 1] + 0.0722f * src.data()[i + 2]; } } void extract_r_from_rgb(const RawTensor &src, RawTensor &dst) { - const size_t min_size = std::min(src.size(), dst.size()); + ARM_COMPUTE_ERROR_ON(src.size() != 3 * dst.size()); + + const size_t num_elements = dst.num_elements(); - for(size_t i = 0, j = 0; i < min_size; i += 3, ++j) + for(size_t i = 0, j = 0; j < num_elements; i += 3, ++j) { dst.data()[j] = src.data()[i]; } @@ -68,9 +75,23 @@ void extract_r_from_rgb(const RawTensor &src, RawTensor &dst) void extract_g_from_rgb(const RawTensor &src, RawTensor &dst) { - const size_t min_size = std::min(src.size(), dst.size()); + ARM_COMPUTE_ERROR_ON(src.size() != 3 * dst.size()); + + const size_t num_elements = dst.num_elements(); + + for(size_t i = 1, j = 0; j < num_elements; i += 3, ++j) + { + dst.data()[j] = src.data()[i]; + } +} + +void extract_b_from_rgb(const RawTensor &src, RawTensor &dst) +{ + ARM_COMPUTE_ERROR_ON(src.size() != 3 * dst.size()); + + const size_t num_elements = dst.num_elements(); - for(size_t i = 1, j = 0; i < min_size; i += 3, ++j) + for(size_t i = 2, j = 0; j < num_elements; i += 3, ++j) { dst.data()[j] = src.data()[i]; } @@ -321,7 +342,8 @@ const AssetsLibrary::Extractor &AssetsLibrary::get_extractor(Format format, Chan static std::map, Extractor> extractors = { { std::make_pair(Format::RGB888, Channel::R), extract_r_from_rgb }, - { std::make_pair(Format::RGB888, Channel::G), extract_g_from_rgb } + { std::make_pair(Format::RGB888, Channel::G), extract_g_from_rgb }, + { std::make_pair(Format::RGB888, Channel::B), extract_b_from_rgb } }; const auto it = extractors.find(std::make_pair(format, channel)); -- cgit v1.2.1