====== FaceDetect ====== Проблема при автоматическом нарезании горизонтальных тумб из вертикальных исходников (или наоборот) в том, что часто тумба попадает в такое место исходного изображения, которое не несет основной смысловой нагрузки. Проще говоря, на тумбе попадается часть живота и все. Примеры этого можно видеть тут [[http://demo.smartcj.com/category/Regular%20Links%202%20FHG/]] Причем такая проблема может возникать и в случае создания например вертикальных тумб из вертикальных исходников, но если голова находится где-то не по центру картинки. Дабы решить эту проблемы мы определяем где находится лицо на фотографии и если оно не попадает в тумбу, то стараемся сдвинуть границы тумбы таким образом, дабы лицо попало туда. Результат автоматической нарезки можно видеть тут [[http://demo.smartcj.com/category/FHG%20and%20Facedetect/]] - это теже галереи что и по ссылке выше, но нарезанные с включенной функцией определения лица. ===== Setup ===== * Надо поставить библиотеку OpenCV (если не знаете как - попросите админа или google) * Скомпилировать программу для определения положения лица. К сожалению в варианте пхп это работает медленно, поэтому есть исходник C++ #include #include #include #include const char* keys = { "{input| |The source image}" "{outdir| |The output directory}" "{cascade| |The cascade file}" }; int main(int argc, const char** argv) { cv::CommandLineParser parser(argc, argv, keys); std::string infile = parser.get("input"); std::string outdir = parser.get("outdir"); std::string cascade_file = parser.get("cascade"); cv::CascadeClassifier cascade; if (cascade_file.empty() || !cascade.load(cascade_file)) { std::cout << cv::format("Error: cannot load cascade file! \n"); return -1; } cv::Mat src = cv::imread(infile); if (src.empty()) { std::cout << cv::format("Error: cannot load source image!\n"); return -1; } cv::Mat gray; cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); cv::equalizeHist(gray, gray); std::vector faces; cascade.detectMultiScale(gray, faces, 1.2, 3); cv::Mat src_copy = src.clone(); for (int i = 0; i < faces.size(); i++) { std::cout << faces[i]; } return 0; } * Компиляция g++ `pkg-config --cflags --libs opencv4` face.cpp `pkg-config --libs opencv4` -o face * Это создаст файл face, который и будет определять положение лица. * Для работы в кроп профайл надо добавить в поле Face Detect /FULL/PATH/TO/face --input={FILE} --cascade=/FULL/PATH/TO/scj/includes/conf/face.xml где /FULL/PATH/TO/face - это только что собранная программа face /FULL/PATH/TO/scj/includes/conf/face.xml - это набор положений для определния лица, он автоматически есть в каждой инсталяции скрипта, однако вы можете его поменять при желании --input={FILE} просто подставляет текущий обрабатываемый файл ===== Face Detect XML ===== OpenCV определяет лица по конфигу (xml файл) , по дефолту идет более базовый конфиг, однако можно взять любой из доступных конфигов, которые дадут другие результаты (более или менее хорошие в зависимости от конктента) Примеры конфигов https://github.com/sightmachine/SimpleCV/tree/master/SimpleCV/Features/HaarCascades