#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);
|
}
|
|
}
|