3

OpenCV ソースからサンプルを取得し、iOS で使用しようとしました。次のことを行いました。

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection {

  // get cv::Mat from CMSampleBufferRef

  UIImage * img = [self imageFromSampleBuffer: sampleBuffer];  
  cv::Mat cvImg = [img CVGrayscaleMat];

  cv::HOGDescriptor hog;
  hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
  cv::vector<cv::Rect> found;     

  hog.detectMultiScale(cvImg, found, 0.2, cv::Size(8,8), cv::Size(16,16), 1.05, 2);


  for( int i = 0; i < (int)found.size(); i++ )
  {

    cv::Rect r = found[i];

    dispatch_async(dispatch_get_main_queue(), ^{
      self.label.text = [NSString stringWithFormat:@"Found at %d, %d, %d, %d", r.x, r.y, r.width, r.height];
    });

    NSLog(@"Found at %d, %d, %d, %d", r.x, r.y, r.width, r.height);         

  }
}

CVGrayscaleMat があった場所

-(cv::Mat)CVGrayscaleMat
{
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGFloat cols = self.size.width;
    CGFloat rows = self.size.height;

    cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                    cols,                      // Width of bitmap
                                                    rows,                     // Height of bitmap
                                                    8,                          // Bits per component
                                                    cvMat.step[0],              // Bytes per row
                                                    colorSpace,                 // Colorspace
                                                    kCGImageAlphaNone |
                                                    kCGBitmapByteOrderDefault); // Bitmap info flags

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
    CGContextRelease(contextRef);
    CGColorSpaceRelease(colorSpace);

    return cvMat;
}

imageFromSampleBuffer は Apple のドキュメントのサンプルです。問題は、アプリが人を検出できないことです。さまざまなサイズとポーズを試しましたが、何もうまくいきませんでした。私は何が欠けていますか?

4

1 に答える 1

3

私はそれを機能させることができました。CV_8UC1 マトリックスは正しいものではないことが判明しましたが、openCV はそれを detectMultiScale メソッドに渡すと、何かが間違っているとは言いません。CV_8UC4をCV_8UC3に変換すると

-(cv::Mat) CVMat3Channels
{
  cv::Mat rgbaMat = [self CVMat];

  cv::Mat rgbMat(self.size.height, self.size.width, CV_8UC3); // 8 bits per component, 3 channels

  cvtColor(rgbaMat, rgbMat, CV_RGBA2RGB, 3);

  return rgbMat;
}

検出が機能し始めます。

于 2012-07-17T08:38:10.117 に答える