New file |
| | |
| | | // 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; |
| | | } |
| | | } |