0

顔の特徴を検出し、透明な画像を介してスプライトを作成している位置を表示します。メインスレッドでスプライトを追加する関数を呼び出している場合、スプライトは正しく表示されますが、バックグラウンドスレッドまたはメイン以外のスレッドでこの関数を呼び出している場合、白いボックスが表示されています。以下に、スクリーンショットとコードスニペットをアップロードしました。

出力のスクリーンショット

- (id)init{

       if( (self=[super init])) {

      [self addBackImageAndControls];
  }
return self;
 }

-(void)addBackImageAndControls{

    UIImage *scalledImage =[originalImage1 scaleToSize:CGSizeMake(320, 480)];
    texture2D =[[CCTexture2D alloc] initWithImage:originalImage1];

    [self body_init];

    self.isTouchEnabled = YES;

    CCMenuItem *done = [CCMenuItemFont itemFromString:@"Done" block:^(id sender) {[self done];}];
    done.position = ccp(40, 60);
    CCMenu *starMenu = [CCMenu menuWithItems:done, nil];//
    starMenu.position =CGPointZero;
    [self addChild:starMenu z:0 tag:125];

    //[self callFunc:scalledImage];

   [NSThread detachNewThreadSelector:@selector(callFunc:) toTarget:self withObject:scalledImage];

}

-(void)done{

  md.LipRect =  [self lipRect];

  [self removeAllChildrenWithCleanup:YES];

   CCMenuItem *item1 = [CCMenuItemFont itemFromString:@"One" block:^(id sender)
      {[self sizeOne];}];
   item1.position = ccp(40, 40);

  CCMenuItem *item2 = [CCMenuItemFont itemFromString:@"Two" block:^(id sender)
    {[self sizeTwo];}];
  item2.position = ccp(110, 40);

  CCMenuItem *item3 = [CCMenuItemFont itemFromString:@"Three" block:^(id sender)
  {[self sizeThree];}];
  item3.position = ccp(180, 40);

  CCMenu *starMenu = [CCMenu menuWithItems:item1,item2,item3, nil];//
  starMenu.position =CGPointZero;
  [self addChild:starMenu];

}

 -(void)callFunc:(UIImage*)image{


   [self opencvFaceDetect:image];
   [self opencvEyeDetect:image];
   [self opencvNoseDetect:image];

   [self LipsEffect];
}
4

1 に答える 1

1

UI を更新する場合は、メイン スレッドで実行する必要があります。UI の更新を次のようにラップします。

dispatch_async(dispatch_get_main_queue(), ^{
    // UI here
});
于 2013-04-08T14:44:04.310 に答える