void whitenSkin()
{
face_detect(image);
int window_size = 11;
int height = image.size().height;
int width = image.size().width;
for (int i = 0; i < (int)faces.size(); i++)
{
int sx = faces[i].x;
int sy = faces[i].y;
int ex = faces[i].x + faces[i].width;
int ey = faces[i].y + faces[i].height;
if (image.channels() == 3)
{
for (int row = sy; row < ey; row++)
{
uchar *data = rub_img.ptr<uchar>(row);
for (int col = sx; col < ex; col++)
{
double r = 0, g = 0, b = 0;
double wr = 0, wg = 0, wb = 0;
for (int i = row - window_size / 2; i <= row + window_size / 2; i++)
for (int j = col - window_size / 2; j <= col + window_size / 2; j++)
{
if (i >= 0 && i < height &&
j >= 0 && j < width)
{
uchar *old_data = old_img.ptr<uchar>(i);
double tb = wij(i, j, row, col, old_data[j * 3], data[col * 3]);
double tg = wij(i, j, row, col, old_data[j * 3 + 1], data[col * 3 + 1]);
double tr = wij(i, j, row, col, old_data[j * 3 + 2], data[col * 3 + 2]);
b += old_data[j * 3] * tb;
g += old_data[j * 3 + 1] * tg;
r += old_data[j * 3 + 2] * tr;
wb += tb;
wg += tg;
wr += tr;
}
}
data[col * 3] = b / wb;
data[col * 3 + 1] = g / wg;
data[col * 3 + 2] = r / wr;
}
}
}
}
}
void face_detect(const cv::Mat &frame)
{
cv::CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_alt.xml")) return;
if (frame.cols > 0 && frame.rows > 0)
{
cv::Mat frame_gray;
if (frame.channels() == 3)
cvtColor(frame, frame_gray, CV_BGR2GRAY);
else
frame_gray = frame.clone();
equalizeHist(frame_gray, frame_gray);
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));
}
}
double wij(int i, int j, int x, int y, uchar gij, uchar gxy)
{
double tds = 400;
double tdr = 500;
int ix = (i - x)*(i - x);
int jy = (j - y)*(j - y);
int gg = (gij - gxy)*(gij - gxy);
double w = exp(-(ix + jy)/tds - gg/tdr);
return w;
}
皮肤美白实现
最新推荐文章于 2024-09-16 15:57:04 发布