86 lines
2.3 KiB
C++
86 lines
2.3 KiB
C++
#include "ImageApplyFadeBackGroundColor.h"
|
|
#include "ImageProcess_Public.h"
|
|
|
|
CImageApplyFadeBackGroudColor::CImageApplyFadeBackGroudColor(int threshold, int offset, int range)
|
|
: m_threshold(threshold)
|
|
, m_offset(offset)
|
|
, m_range(range)
|
|
{
|
|
}
|
|
|
|
CImageApplyFadeBackGroudColor::~CImageApplyFadeBackGroudColor()
|
|
{
|
|
}
|
|
|
|
void CImageApplyFadeBackGroudColor::apply(cv::Mat& pDib, int side)
|
|
{
|
|
if (pDib.channels() != 3)
|
|
return;
|
|
|
|
#if 0
|
|
cv::Mat mask;
|
|
cv::cvtColor(pDib, mask, cv::COLOR_BGR2GRAY);
|
|
cv::threshold(mask, mask, m_threshold, 255, cv::THRESH_BINARY);
|
|
//cv::imwrite("mask.jpg", mask);
|
|
cv::Mat bgr[3];
|
|
cv::split(pDib, bgr);
|
|
|
|
int histSize = 255;
|
|
float range[] = { 0, 255 };
|
|
const float* histRange = { range };
|
|
|
|
cv::Mat hist_bgr[3];
|
|
cv::Scalar mean_bgr;
|
|
for (size_t i = 0; i < 3; i++)
|
|
{
|
|
cv::calcHist(&bgr[i], 1, 0, mask, hist_bgr[i], 1, &histSize, &histRange);
|
|
double maxVal = 0;
|
|
cv::Point maxLoc;
|
|
cv::minMaxLoc(hist_bgr[i], NULL, &maxVal, NULL, &maxLoc);
|
|
mean_bgr[i] = maxLoc.y;
|
|
}
|
|
|
|
cv::add(pDib, cv::Scalar::all(255 + m_offset) - mean_bgr, pDib, mask);
|
|
#else
|
|
#if 0
|
|
fadeBackground(pDib.data, pDib.cols, pDib.rows, pDib.step, m_threshold, m_offset, m_range);
|
|
#else
|
|
fadeBackground(pDib, m_threshold, m_offset, m_range);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void CImageApplyFadeBackGroudColor::fadeBackground(cv::Mat& image, int threshold, int offset, int range)
|
|
{
|
|
cv::Mat resizeMat;
|
|
cv::resize(image, resizeMat, cv::Size(200, 200));
|
|
cv::Mat mask;
|
|
cv::cvtColor(resizeMat, mask, cv::COLOR_BGR2GRAY);
|
|
cv::threshold(mask, mask, threshold, 255, cv::THRESH_BINARY);
|
|
|
|
cv::Scalar bgc = hg::getBackGroundColor(resizeMat, mask, threshold);
|
|
|
|
std::vector<int> low, up;
|
|
for (size_t i = 0; i < 3; i++)
|
|
{
|
|
low.push_back(cv::max((int)bgc[i] - range, 0));
|
|
up.push_back(cv::min((int)bgc[i] + range, 255));
|
|
}
|
|
|
|
cv::inRange(image, low, up, mask);
|
|
cv::add(image, cv::Scalar::all(offset), image, mask);
|
|
}
|
|
|
|
void CImageApplyFadeBackGroudColor::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
|
{
|
|
(void)isTwoSide;
|
|
int i = 0;
|
|
for (cv::Mat& var : mats)
|
|
if (!var.empty())
|
|
{
|
|
apply(var, i);
|
|
i++;
|
|
}
|
|
}
|
|
|