6

我使用这里的代码来查找 Face。我试着画眼睛和脸。但我只能显示眼睛或脸,这取决于我先写哪个陈述。这该怎么做?

// Detect faces
std::vector faces;
_faceCascade.detectMultiScale(mat, faces, 1.1, 2, kHaarOptions, cv::Size(60, 60));
//Detect eyes
std::vector eyes;
_eyesCascade.detectMultiScale(mat, eyes, 1.1, 2, kHaarOptions, cv::Size(30, 30));

这里eyes.size() = 0。如果我交换两个语句的位置,我得到eyes.size() = 2 和 faces.size() = 0

4

3 回答 3

14

如果您的目标是在 iOS 上检索面部和眼睛的位置,为什么不使用 CoreImage 功能?

CIImage *image = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:@"image.jpg"]];

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy, nil];

CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:options];

NSArray *features = [faceDetector featuresInImage:image];
for(CIFaceFeature* faceFeature in features)
{
    CGRect faceSize = faceFeature.bounds.size;
    PointF leftEyePosition;
    PointF rightEyePosition;
    PointF mouthPosition;

    if(faceFeature.hasLeftEyePosition)
        leftEyePosition = faceFeature.leftEyePosition;
    //do the same for right eye and mouth
}

它不使用 OpenCV,但你可以免费获得嘴的位置。

于 2013-02-02T21:48:54.407 回答
0

只复制共享输入参数(即复制 mat 到 mat2 并将其用作第二个输入)是合乎逻辑的。

于 2013-01-25T14:56:07.070 回答
0

变量 mat 是一个数组,按值传递。在函数内部,mat 中的值会发生变化,因此您首先放置的任何语句都会正确实现,而第二个语句的 mat 会发生变化。因此,在任一语句之前创建变量 mat 的深层副本,并在第二个语句中使用 mat-copy 变量代替 mat。

于 2013-01-28T20:17:35.247 回答