admin
2025-04-25 a01457b5471049edc3d8302c0d978cb8b53e79c9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#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);
    }
    
}