2

AVCapture でキャプチャしたビデオに CALayer を表示したい。レイヤーを表示できますが、次のフレームでは前のレイヤーを削除する必要があります。

私のコードは次のとおりです。

[CATransaction begin];  
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

for (int i = 0; i < faces.size(); i++) {
     CGRect faceRect;
     // Get the Graphics Context        

     faceRect.origin.x = xyPoints.x;
     faceRect.origin.y = xyPoints.y;
     faceRect.size.width =50; //faces[i].width;
     faceRect.size.height =50;// faces[i].height;

     CALayer *featureLayer=nil;         

     // faceRect = CGRectApplyAffineTransform(faceRect, t);
     if (!featureLayer) {
         featureLayer = [[CALayer alloc]init];

         featureLayer.borderColor = [[UIColor redColor] CGColor];
         featureLayer.borderWidth = 10.0f;
         [self.view.layer addSublayer:featureLayer];

     }

     featureLayer.frame = faceRect;

     NSLog(@"frame-x - %f, frame-y - %f, frame-width - %f, frame-height - %f",featureLayer.frame.origin.x,featureLayer.frame.origin.y,featureLayer.frame.size.width,featureLayer.frame.size.height);
 }

//  [featureLayer removeFromSuperlayer]; 
[CATransaction commit];

face は(const std::vector<cv::Rect)faceOpenCV 形式です。コードを配置する場所を知る必要があります[featureLayer removeFromSuperLayer];

注:「顔」は顔検出用ではありません...単なる長方形です。

4

1 に答える 1

1

私は解決策を手に入れました... featureLayer は、これをアイデンティティとして与えた CALayer オブジェクトです。お気に入り

featureLayer.name = @"earLayer";

フレーム内のオブジェクトを検出するたびに、次のようにメインビューからサブレイヤーを取得します

NSArray *sublayers = [NSArray arrayWithArray:[self.view.layer sublayers]];

サブレイヤーをカウントして、以下のように for ループにチェックインします。

int sublayersCount = [sublayers count];
    int currentSublayer = 0;
for (CALayer *layer in sublayers) {
        NSString *layerName = [layer name];
        if ([layerName isEqualToString:@"earayer"])
            [layer setHidden:YES];
}

これで、検出されたオブジェクトを含む適切なレイヤーを取得しています。

于 2013-06-26T13:50:51.200 に答える