- en
- ru
This is an old revision of the document!
FaceDetect
Проблема при автоматическом нарезании горизонтальных тумб из вертикальных исходников (или наоборот) в том, что часто тумба попадает в такое место исходного изображения, которое не несет основной смысловой нагрузки. Проще говоря, на тумбе попадается часть живота и все. Примеры этого можно видеть тут http://demo.smartcj.com/category/Regular%20Links%202%20FHG/
Причем такая проблема может возникать и в случае создания например вертикальных тумб из вертикальных исходников, но если голова находится где-то не по центру картинки.
Дабы решить эту проблемы мы определяем где находится лицо на фотографии и если оно не попадает в тумбу, то стараемся сдвинуть границы тумбы таким образом, дабы лицо попало туда.
Результат автоматической нарезки можно видеть тут http://demo.smartcj.com/category/FHG%20and%20Facedetect/ - это теже галереи что и по ссылке выше, но нарезанные с включенной функцией определения лица.
Setup
- Надо поставить библиотеку OpenCV (если не знаете как - попросите админа или google)
- Скомпилировать программу для определения положения лица. К сожалению в варианте пхп это работает медленно, поэтому есть исходник C++
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
const char* keys =
{
"{i|input| |The source image}"
"{o|outdir| |The output directory}"
"{c|cascade| |The cascade file}"
};
int main(int argc, const char** argv)
{
cv::CommandLineParser parser(argc, argv, keys);
std::string infile = parser.get<std::string>("input");
std::string outdir = parser.get<std::string>("outdir");
std::string cascade_file = parser.get<std::string>("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_BGR2GRAY);
cv::equalizeHist(gray, gray);
std::vector<cv::Rect> 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 opencv` face.cpp `pkg-config --libs opencv` -o face
<code>
* Это создаст файл face, который и будет определять положение лица.
* Для работы в кроп профайл надо добавить в поле Face Detect
<code>
/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} просто подставляет текущий обрабатываемый файл
