93 lines
2.9 KiB
C++
93 lines
2.9 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 {
|
|
|
|
TEST(ThresholdOtsuTest, accuracy)
|
|
{
|
|
applyTestTag(CV_TEST_TAG_FASTCV_SKIP_DSP);
|
|
|
|
//Initialize DSP
|
|
int initStatus = cv::fastcv::dsp::fcvdspinit();
|
|
ASSERT_EQ(initStatus, 0) << "Failed to initialize FastCV DSP";
|
|
|
|
cv::Mat src;
|
|
src.allocator = cv::fastcv::getQcAllocator();
|
|
cv::imread(cvtest::findDataFile("cv/detectors_descriptors_evaluation/planar/box_in_scene.png"), src, cv::IMREAD_GRAYSCALE);
|
|
ASSERT_FALSE(src.empty()) << "Could not read the image file.";
|
|
|
|
cv::Mat dst;
|
|
dst.allocator = cv::fastcv::getQcAllocator();
|
|
|
|
bool type = 0;
|
|
|
|
cv::fastcv::dsp::thresholdOtsu(src, dst, type);
|
|
|
|
// De-Initialize DSP
|
|
cv::fastcv::dsp::fcvdspdeinit();
|
|
|
|
EXPECT_FALSE(dst.empty());
|
|
EXPECT_EQ(src.size(), dst.size());
|
|
|
|
// Compare the result against the reference cv::threshold function with Otsu's method
|
|
cv::Mat referenceDst;
|
|
cv::threshold(src, referenceDst, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
|
|
|
|
double maxDifference = 10.0;
|
|
cv::Mat diff;
|
|
cv::absdiff(dst, referenceDst, diff);
|
|
double maxVal;
|
|
cv::minMaxLoc(diff, nullptr, &maxVal);
|
|
|
|
EXPECT_LE(maxVal, maxDifference) << "The custom threshold result differs from the reference result by more than the acceptable threshold.";
|
|
}
|
|
|
|
TEST(ThresholdOtsuTest, inPlaceAccuracy)
|
|
{
|
|
applyTestTag(CV_TEST_TAG_FASTCV_SKIP_DSP);
|
|
|
|
// Initialize DSP
|
|
int initStatus = cv::fastcv::dsp::fcvdspinit();
|
|
ASSERT_EQ(initStatus, 0) << "Failed to initialize FastCV DSP";
|
|
|
|
cv::Mat src;
|
|
src.allocator = cv::fastcv::getQcAllocator();
|
|
cv::imread(cvtest::findDataFile("cv/detectors_descriptors_evaluation/planar/box_in_scene.png"), src, cv::IMREAD_GRAYSCALE);
|
|
ASSERT_FALSE(src.empty()) << "Could not read the image file.";
|
|
|
|
// Use the same buffer for in-place operation
|
|
cv::Mat dst;
|
|
dst.allocator = cv::fastcv::getQcAllocator();
|
|
src.copyTo(dst);
|
|
|
|
bool type = false;
|
|
|
|
// Call the thresholdOtsu function for in-place operation
|
|
cv::fastcv::dsp::thresholdOtsu(dst, dst, type);
|
|
|
|
// De-Initialize DSP
|
|
cv::fastcv::dsp::fcvdspdeinit();
|
|
|
|
// Check if the output is not empty
|
|
EXPECT_FALSE(dst.empty());
|
|
EXPECT_EQ(src.size(), dst.size());
|
|
|
|
// Compare the result against the reference cv::threshold function with Otsu's method
|
|
cv::Mat referenceDst;
|
|
cv::threshold(src, referenceDst, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
|
|
|
|
double maxDifference = 10.0;
|
|
cv::Mat diff;
|
|
cv::absdiff(dst, referenceDst, diff);
|
|
double maxVal;
|
|
cv::minMaxLoc(diff, nullptr, &maxVal);
|
|
|
|
EXPECT_LE(maxVal, maxDifference) << "The in-place threshold result differs from the reference result by more than the acceptable threshold.";
|
|
}
|
|
|
|
}} // namespaces opencv_test, ::
|