This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
ru:facedetect [2021/04/01 13:54] admin [Setup] |
ru:facedetect [2021/04/01 13:55] (current) admin [Setup] |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== FaceDetect ====== | ||
+ | |||
+ | Проблема при автоматическом нарезании горизонтальных тумб из вертикальных исходников (или наоборот) в том, что часто тумба попадает в такое место исходного изображения, | ||
+ | |||
+ | Причем такая проблема может возникать и в случае создания например вертикальных тумб из вертикальных исходников, | ||
+ | |||
+ | Дабы решить эту проблемы мы определяем где находится лицо на фотографии и если оно не попадает в тумбу, то стараемся сдвинуть границы тумбы таким образом, | ||
+ | |||
+ | Результат автоматической нарезки можно видеть тут [[http:// | ||
+ | |||
+ | ===== Setup ===== | ||
+ | |||
+ | * Надо поставить библиотеку OpenCV (если не знаете как - попросите админа или google) | ||
+ | * Скомпилировать программу для определения положения лица. К сожалению в варианте пхп это работает медленно, | ||
+ | |||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | const char* keys = | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | |||
+ | int main(int argc, const char** argv) | ||
+ | { | ||
+ | cv:: | ||
+ | std::string infile = parser.get< | ||
+ | std::string outdir = parser.get< | ||
+ | std::string cascade_file = parser.get< | ||
+ | |||
+ | cv:: | ||
+ | if (cascade_file.empty() || !cascade.load(cascade_file)) | ||
+ | { | ||
+ | std::cout << cv:: | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | cv::Mat src = cv:: | ||
+ | if (src.empty()) | ||
+ | { | ||
+ | std::cout << cv:: | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | cv::Mat gray; | ||
+ | cv:: | ||
+ | cv:: | ||
+ | |||
+ | std:: | ||
+ | cascade.detectMultiScale(gray, | ||
+ | |||
+ | cv::Mat src_copy = src.clone(); | ||
+ | for (int i = 0; i < faces.size(); | ||
+ | { | ||
+ | std::cout << faces[i]; | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | * Компиляция | ||
+ | |||
+ | < | ||
+ | g++ `pkg-config --cflags --libs opencv4` face.cpp `pkg-config --libs opencv4` -o face | ||
+ | </ | ||
+ | |||
+ | |||
+ | * Это создаст файл face, который и будет определять положение лица. | ||
+ | * Для работы в кроп профайл надо добавить в поле Face Detect | ||
+ | |||
+ | < | ||
+ | / | ||
+ | |||
+ | где / | ||
+ | |||
+ | / | ||
+ | |||
+ | --input={FILE} | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Face Detect XML ===== | ||
+ | |||
+ | OpenCV определяет лица по конфигу (xml файл) , по дефолту идет более базовый конфиг, | ||
+ | |||
+ | Примеры конфигов https:// | ||