mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-16 22:35:51 +08:00

Add FastCV DSP Initialization, QcAllocator and FastCV DSP Extension APIs #3931 Merge with https://github.com/opencv/opencv/pull/27290 **Detailed Description** This PR introduces FastCV DSP Extension APIs within the '**cv::fastcv::dsp**' namespace. The following APIs have been added: 1. **fcvdspinit**: Initializes the FastCV DSP environment. 2. **fcvdspdeinit**: Deinitializes the FastCV DSP environment. 3. **sumOfAbsoluteDiffs**: Computes the sum of absolute differences of an image against an 8x8 template. 4. **thresholdOtsu**: Binarizes a grayscale image using Otsu's method. 5. **FFT**: Computes the 1D or 2D Fast Fourier Transform of a real-valued matrix. 6. **IFFT**: Computes the 1D or 2D Inverse Fast Fourier Transform of a complex-valued matrix. 7. **canny**: Applies the Canny edge detector to an 8-bit grayscale image. 8. **filter2D**: Applies a generic 2D filter to an image. The **QcAllocator** has been added to manage memory allocations on Qualcomm's Chipsets. This allocator ensures that matrices are allocated using the Qualcomm hardware memory allocator, providing efficient DSP operations. Requires updated binary from: https://github.com/opencv/opencv_3rdparty/pull/97 Requires binary from https://github.com/opencv/opencv_3rdparty/pull/95 Lib Hash Update: https://github.com/opencv/opencv/pull/27403 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [ ] The PR is proposed to the proper branch - [ ] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake
99 lines
2.5 KiB
C++
99 lines
2.5 KiB
C++
/*
|
|
* Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include "test_precomp.hpp"
|
|
|
|
namespace opencv_test { namespace {
|
|
|
|
class FFT_DSPExtTest : public ::testing::TestWithParam<cv::Size> {};
|
|
|
|
TEST_P(FFT_DSPExtTest, forward)
|
|
{
|
|
applyTestTag(CV_TEST_TAG_FASTCV_SKIP_DSP);
|
|
|
|
//Initialize DSP
|
|
int initStatus = cv::fastcv::dsp::fcvdspinit();
|
|
ASSERT_EQ(initStatus, 0) << "Failed to initialize FastCV DSP";
|
|
|
|
Size size = GetParam();
|
|
|
|
RNG& rng = cv::theRNG();
|
|
|
|
Mat src;
|
|
src.allocator = cv::fastcv::getQcAllocator();
|
|
src.create(size, CV_8UC1);
|
|
|
|
cvtest::randUni(rng, src, Scalar::all(0), Scalar::all(256));
|
|
|
|
Mat srcFloat;
|
|
src.convertTo(srcFloat, CV_32F);
|
|
|
|
Mat dst, ref;
|
|
dst.allocator = cv::fastcv::getQcAllocator();
|
|
cv::fastcv::dsp::FFT(src, dst);
|
|
|
|
//De-Initialize DSP
|
|
cv::fastcv::dsp::fcvdspdeinit();
|
|
|
|
cv::dft(srcFloat, ref, DFT_COMPLEX_OUTPUT);
|
|
|
|
double normInf = cvtest::norm(dst, ref, cv::NORM_INF);
|
|
double normL2 = cvtest::norm(dst, ref, cv::NORM_L2) / dst.size().area();
|
|
|
|
EXPECT_LT(normInf, 19.1); // for 512x512 case
|
|
EXPECT_LT(normL2, 18.0 / 256.0 );
|
|
}
|
|
|
|
TEST_P(FFT_DSPExtTest, inverse)
|
|
{
|
|
applyTestTag(CV_TEST_TAG_FASTCV_SKIP_DSP);
|
|
|
|
//Initialize DSP
|
|
int initStatus = cv::fastcv::dsp::fcvdspinit();
|
|
ASSERT_EQ(initStatus, 0) << "Failed to initialize FastCV DSP";
|
|
|
|
Size size = GetParam();
|
|
|
|
RNG& rng = cv::theRNG();
|
|
|
|
Mat src;
|
|
src.allocator = cv::fastcv::getQcAllocator();
|
|
src.create(size, CV_8UC1);
|
|
|
|
cvtest::randUni(rng, src, Scalar::all(0), Scalar::all(256));
|
|
|
|
Mat srcFloat;
|
|
src.convertTo(srcFloat, CV_32F);
|
|
|
|
Mat fwd, back;
|
|
fwd.allocator = cv::fastcv::getQcAllocator();
|
|
back.allocator = cv::fastcv::getQcAllocator();
|
|
|
|
cv::fastcv::dsp::FFT(src, fwd);
|
|
cv::fastcv::dsp::IFFT(fwd, back);
|
|
|
|
//De-Initialize DSP
|
|
cv::fastcv::dsp::fcvdspdeinit();
|
|
|
|
Mat backFloat;
|
|
back.convertTo(backFloat, CV_32F);
|
|
|
|
Mat fwdRef, backRef;
|
|
cv::dft(srcFloat, fwdRef, DFT_COMPLEX_OUTPUT);
|
|
cv::idft(fwdRef, backRef, DFT_REAL_OUTPUT);
|
|
|
|
backRef *= 1./(src.size().area());
|
|
|
|
double normInf = cvtest::norm(backFloat, backRef, cv::NORM_INF);
|
|
double normL2 = cvtest::norm(backFloat, backRef, cv::NORM_L2) / src.size().area();
|
|
|
|
EXPECT_LT(normInf, 9.16e-05);
|
|
EXPECT_LT(normL2, 1.228e-06);
|
|
}
|
|
|
|
INSTANTIATE_TEST_CASE_P(FastCV_Extension, FFT_DSPExtTest, ::testing::Values(Size(256, 256), Size(512, 512)));
|
|
|
|
}} // namespaces opencv_test, ::
|