#include #include #include #include #include #include #include #include #include #include #include #include #include "ImageDetectConfig.h" #include "log_manager.h" using namespace std; using namespace cv; // cast 计算出的偏差值,小于1.0表示比较正常,大于1.0表示存在亮度异常; // 当cast异常时,da大于0表示过亮,da小于0表示过暗。 void detect_brightness(cv::Mat input_img, float& cast, float& da) { cv::Mat gray_img; cv::cvtColor(input_img, gray_img, CV_BGR2GRAY); float a = 0, Ma = 0; int hist[256] = { 0 }; for (int i = 0; i < gray_img.rows; i++) { for (int j = 0; j < gray_img.cols; j++) { a += float(gray_img.at(i, j) - 128); // 在计算过程中,考虑128为亮度均值点 hist[gray_img.at(i, j)]++; } } da = a / float(gray_img.total()); for (int i = 0; i < 256; i++) { Ma += abs(i - 128 - da) * hist[i]; } Ma /= float(gray_img.total()); cast = abs(da) / abs(Ma); } void detect_saturation(cv::Mat input_img, float& satu) { Mat dstImage1; cvtColor(input_img, dstImage1, COLOR_RGB2HSV); vector channels; split(dstImage1, channels);//分离HSV Scalar mean; //均值 Scalar stddev; //标准差 meanStdDev( channels[1], mean, stddev ); //计算均值和标准差 satu = mean.val[0]; } int main(int argc, char *argv[]) { Mat img = imread(argv[1]); float cast, da, satu; detect_brightness(img, cast, da); detect_saturation(img, satu); cout<