#include "ImageApplyColorRecognition.h" #include "ImageApplyHeaders.h" static CImageApplyBWBinaray m_bw; static CImageApplyAdjustColors m_ac(0, 50, 1.0f); /// /// 检测图像是否是彩色。当前逻辑仅针对红色像素进行判断,即存在红色像素则为彩色,否则为非彩色 /// /// 待测图像 /// true为彩色,false为非彩色 bool isColor(const cv::Mat& image) { if (image.channels() != 3) return false; cv::Mat pDib_resize; cv::resize(image, pDib_resize, cv::Size(image.cols / 9, image.rows / 9), 0, 0, cv::INTER_AREA); cv::Mat hsv; cv::cvtColor(pDib_resize, hsv, cv::COLOR_BGR2HSV_FULL); std::vector hsv_channels; cv::split(hsv, hsv_channels); cv::Mat range_h1, range_h2, range_s, range_v; cv::inRange(hsv_channels[0], 0, 85, range_h1); cv::inRange(hsv_channels[0], 170, 255, range_h2); cv::inRange(hsv_channels[1], 60, 255, range_s); cv::inRange(hsv_channels[2], 100, 255, range_v); cv::Mat thre = (range_h1 | range_h2) & range_s & range_v; return (cv::sum(thre)[0] / 255)> 4; } bool isGray(const cv::Mat& image) { if (image.channels() == 3) return true; cv::Mat image_clone; cv::resize(image, image_clone, cv::Size(), 0.25, 0.25); int channels[] = { 0 }; int histsize[] = { 256 }; float range[] = { 0, 256 }; const float* histRanges[] = { range }; cv::Mat hist; cv::calcHist(&image_clone, 1, channels, cv::Mat(), hist, 1, histsize, histRanges, true, false); float pixel_count0 = hist.at(0, 0); float pixel_count255 = hist.at(255, 0); float total = image_clone.total(); return ((pixel_count0 + pixel_count255) / total) > 0.95; } CImageApplyColorRecognition::CImageApplyColorRecognition(ColorRecognitionMode mode) : m_mode(mode) { } CImageApplyColorRecognition::~CImageApplyColorRecognition(void) { } void CImageApplyColorRecognition::apply(cv::Mat& pDib, int side) { //先判断是否需要判断是彩色 if (m_mode == AllColor || m_mode == Color_Gray || m_mode == Color_Mono) { //如果是彩色,直接退出 if (isColor(pDib)) { m_result = Color; return; } } if (pDib.channels() == 3) cv::cvtColor(pDib, pDib, cv::COLOR_BGR2GRAY); if (m_mode == Color_Gray) { m_result = Gray; return; } if (m_mode == Color_Mono) { m_bw.apply(pDib, side); m_result = Mono; return; } if (isGray(pDib)) m_result = Gray; else { m_bw.apply(pDib, side); m_result = Mono; } } void CImageApplyColorRecognition::apply(std::vector& mats, bool isTwoSide) { m_results.clear(); if (mats.empty()) return; if (!mats[0].empty()) apply(mats[0], 0); m_results.push_back(m_result); if (isTwoSide && mats.size() > 1) if (!mats[1].empty()) apply(mats[1], 1); m_results.push_back(m_result); } CImageApplyColorRecognition::ColorType CImageApplyColorRecognition::getResult() { return m_result; } std::vector CImageApplyColorRecognition::getResults() { return m_results; }