Files

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, ::