#include "ImageApplyColorRecognition.h" 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 pixels[256] = { 0 }; //for (size_t i = 0; i < 256; i++) // pixels[i] = hist.at(i, 0); //float sum = 0; //for (size_t i = 0; i < 40; i++) //{ //} //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; return false; } CImageApplyColorRecognition::CImageApplyColorRecognition(ColorRecognitionMode mode) : m_mode(mode) { } CImageApplyColorRecognition::~CImageApplyColorRecognition(void) { } #define HSV_S_THRE 30 void CImageApplyColorRecognition::apply(cv::Mat& pDib, int side) { if (pDib.channels() != 3) { m_result = Gray; return; } m_result = isColor(pDib, HSV_S_THRE) ? Color : Gray; if (m_result == Gray && pDib.channels() == 3) cv::cvtColor(pDib, pDib, cv::COLOR_BGR2GRAY); //先判断是否需要判断是彩色 //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; } /// /// 检测图像是否是彩色。当前逻辑仅针对红色像素进行判断,即存在红色像素则为彩色,否则为非彩色 /// /// 待测图像 /// true为彩色,false为非彩色 bool CImageApplyColorRecognition::isColor(const cv::Mat& image, double threshold) { if (image.channels() != 3) return false; cv::Mat pDib_resize; cv::resize(image, pDib_resize, cv::Size(200, 200), 0, 0, cv::INTER_AREA); //cv::imwrite("pDib_resize.bmp", pDib_resize); cv::Mat hsv; cv::cvtColor(pDib_resize, hsv, cv::COLOR_BGR2HSV_FULL); std::vector hsv_channels; cv::split(hsv, hsv_channels); double minVal, maxVal; cv::minMaxLoc(hsv_channels[1], &minVal, &maxVal); return maxVal > threshold; }