是否有任何简单的算法来判断给定的图像是面部还是其他东西(希望没有训练)?
我的想法是构造每个图像的特征向量,然后应用一些聚类方法(例如k-means,其中k = 2)。但即使获得了良好的聚类结果,我也不确定区分面部/非面部的最佳标准是什么?
答案 0 :(得分:3)
特征分解通过在具有高方差的数据空间中查找方向来减少连续域中的维度。 K-means在具有高密度点的空间中找到聚类。你可以把它们混合在一起,同时完全忽略你如何在第一个地方到达脸部特征(你将如何缩放,旋转和裁剪你想要检查的任何东西)。
你不需要训练哈尔探测器,因为他们已经训练过脸部。他们检测到一张脸,而不是识别它的身份。你需要的是将代码与一个小文件一起移植,该文件包含训练之后获得的参数(已经执行过),如上面Shiva所建议的那样。
尽管如此,对代码进行粗心的复制粘贴并没有多大意义。阅读一下Haar。试着理解
答案 1 :(得分:1)
您可以在图像/视频帧中使用Haar分类器方法进行人脸检测。
用于在图像中查找面部的示例代码将是这样的
int main(int argc, _TCHAR* argv[])
{
IplImage* img;
img = cvLoadImage( "dasl_hubo.jpg" );
CvMemStorage* storage = cvCreateMemStorage(0);
// Note that you must copy C:\Program Files\OpenCV\data\haarcascades\haarcascade_frontalface_alt2.xml or where opencv is installed
// to your working directory
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_alt2.xml" );
double scale = 1.3;
static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}},
{{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };// this will draw rectangles of these colors around the detected faces.
// Detect objects
cvClearMemStorage( storage );
CvSeq* objects = cvHaarDetectObjects( img, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));
CvRect* r;
// Loop through objects and draw boxes
for( int i = 0; i < (objects ? objects->total : 0 ); i++ ){
r = ( CvRect* )cvGetSeqElem( objects, i );
cvRectangle( img, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),
colors[i%8]);
}
cvNamedWindow( "Output" );
cvShowImage( "Output", img );
cvWaitKey();
cvReleaseImage( &img );
return 0;
}
访问这些链接,了解有关使用harr级联的面部检测的更多信息
答案 2 :(得分:1)
这是我在C ++中的opencv代码,借助Opencv haar-like功能可以很容易地检测图像中的面部,您可以参考文档中的一些方法来使用它们。我希望它有所帮助。
CascadeClassifier face_cascade; //for read in haar-like faces database in opencv
std::vector<Rect> faces; //for storing detected faces
vector<Point2d> FaceCenter; //for storing centres of faces
Mat frame_gray = imread(“/Users/xxx/Desktop/xxx.jpg”, CV_8UC1); //read the image in gray-scale;
equalizeHist( frame_gray, frame_gray ); //histogram to extract the contrast
String face_cascade_name = "/Users/xxx/opencv-2.4.7/data/haarcascades/haarcascade_frontalface_alt.xml"; //path of the trained faces .xml file
if(!face_cascade.load(face_cascade_name)) //load the .xml
{
cout << "face_casacade.xml load error" << endl;
}
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0, Size(50, 50) ); //Detect faces in the image
for(size_t i = 0; i < faces.size(); i++)
{
Point2d center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); //store centres of faces
FaceCenter.push_back(center);
int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); //circle the faces in the image, optional
ellipse( frame_gray, center, Size( eyes[j].width*0.5, eyes[j].height*0.25), 0, 0, 360, Scalar( 255, 0, 0 ), 2, 8, 0 );
}
imshow(“Faces Detection”, frame_gray); //show the result