#include"cover.h" bool Cover::initConfig(float ratio, float threshold, int blockSize, int size) { Size = size; BlockSize = blockSize; Threshold = threshold; Ratio = ratio; blocks = size / blockSize; x = blockSize * 3 / 4; w = blockSize/4; return true; } int Cover::detect(cv::Mat& image) { try { cv::Mat gray, resized; int channels = image.channels(); if (channels == 3) { cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); cv::resize(gray, resized, cv::Size(Size, Size)); } else if (channels == 1) { cv::resize(image, resized, cv::Size(Size, Size)); } cv::Mat roi, dct_result; cv::Rect recth(x, x, w, w); // float n = 0; for (int i = 0; i < blocks; i++) { for (int j = 0; j < blocks; j++) { cv::Rect rect(i * BlockSize, j * BlockSize, BlockSize, BlockSize); roi = resized(rect); //roi.convertTo(roi,CV_32FC1,1.0/255); roi.convertTo(roi, CV_32FC1); cv::dct(roi, dct_result); float* data = (float*)dct_result(recth).data; float sum = 0; for (int i = 0; i < w * w; i++) { sum += abs(data[i]); } float mean = sum / (float)(w * w); if (mean < Threshold) { n += 1; } } } if (n / (float)(blocks * blocks) >= Ratio) { return 1; } else { return 0; } } catch (const std::exception& ex) { std::string errorMessage = "cover-"; errorMessage += ex.what(); throw std::runtime_error(errorMessage); } }