// ImageProcessor.cpp - ÕÕÆ¬´¦ÀíÄ£¿éʵÏÖ
|
#include "stdafx.h"
|
#include "ImageProcessor.h"
|
#include <opencv2/opencv.hpp>
|
|
ImageProcessor::ImageProcessor() {}
|
|
ImageProcessor::~ImageProcessor() {}
|
|
bool ImageProcessor::CropFace(const unsigned char* imageData, int width, int height,
|
unsigned char*& faceData, int& faceWidth, int& faceHeight) const {
|
try {
|
// ´´½¨OpenCVͼÏñ
|
cv::Mat image(height, width, CV_8UC3, const_cast<unsigned char*>(imageData));
|
|
// ¼ÓÔØÈËÁ³¼ì²âÆ÷
|
cv::CascadeClassifier face_cascade;
|
if (!face_cascade.load(cv::samples::findFile("haarcascade_frontalface_alt.xml"))) {
|
std::cerr << "ÎÞ·¨¼ÓÔØÈËÁ³¼ì²âÆ÷" << std::endl;
|
return false;
|
}
|
|
// ת»»Îª»Ò¶Èͼ
|
cv::Mat gray;
|
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
|
cv::equalizeHist(gray, gray);
|
|
// ¼ì²âÈËÁ³
|
std::vector<cv::Rect> faces;
|
face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
|
|
if (faces.empty()) {
|
return false;
|
}
|
|
// »ñÈ¡µÚÒ»¸ö¼ì²âµ½µÄÈËÁ³
|
cv::Rect face_rect = faces[0];
|
cv::Mat face = image(face_rect);
|
|
// ±£´æÈËÁ³Êý¾Ý
|
faceWidth = face.cols;
|
faceHeight = face.rows;
|
size_t dataSize = faceWidth * faceHeight * 3;
|
|
faceData = new unsigned char[dataSize];
|
memcpy(faceData, face.data, dataSize);
|
|
return true;
|
}
|
catch (const std::exception& e) {
|
std::cerr << "²Ã¼ôÈËÁ³Ê§°Ü: " << e.what() << std::endl;
|
return false;
|
}
|
}
|
|
bool ImageProcessor::EnhanceQuality(unsigned char* imageData, int width, int height) const {
|
try {
|
// ´´½¨OpenCVͼÏñ
|
cv::Mat image(height, width, CV_8UC3, imageData);
|
|
// ͼÏñÔöÇ¿´¦Àí
|
cv::Mat enhanced;
|
cv::GaussianBlur(image, enhanced, cv::Size(0, 0), 3);
|
cv::addWeighted(image, 1.5, enhanced, -0.5, 0, enhanced);
|
|
// ¸´ÖÆ»ØÔʼÊý¾Ý
|
memcpy(imageData, enhanced.data, width * height * 3);
|
|
return true;
|
}
|
catch (const std::exception& e) {
|
std::cerr << "ÔöǿͼÏñÖÊÁ¿Ê§°Ü: " << e.what() << std::endl;
|
return false;
|
}
|
}
|
|
bool ImageProcessor::ValidateImage(const unsigned char* imageData, int width, int height) const {
|
try {
|
// ¼òµ¥ÑéÖ¤£º¼ì²éͼÏñ³ß´çÊÇ·ñºÏÀí
|
if (width < 10 || height < 10) {
|
return false;
|
}
|
|
// ÕâÀï¿ÉÒÔÌí¼Ó¸ü¸´ÔÓµÄͼÏñÑéÖ¤Âß¼
|
// ÀýÈ磺¼ì²éͼÏñÊÇ·ñÄ£ºý¡¢ÊÇ·ñ°üº¬ÈËÁ³µÈ
|
|
return true;
|
}
|
catch (const std::exception& e) {
|
std::cerr << "Ñé֤ͼÏñʧ°Ü: " << e.what() << std::endl;
|
return false;
|
}
|
}
|