Оболочка Swift + OpenCV - как go перейти к новому виду после завершения обнаружения объекта - PullRequest
0 голосов
/ 14 апреля 2020

Я использую оболочку Objective-C ++ для openCV в Swift 5 (и XCode 11.4). Это работает, и мое обнаружение объекта работает в режиме реального времени на телефоне. Однако я не могу понять, как перейти к другому (заранее определенному) представлению / экрану результатов после того, как мои задачи по обнаружению возражений будут выполнены. Все действия происходят в моей оболочке c ++ - есть ли способ выполнить переход изнутри c ++ или выполнить функцию, связанную с базовым viewcontroller, et c? Ниже приведены мои ViewController.swift и OpenCVWrapper.mm (не включая OpenCVWrapper.h и заголовок моста - они, похоже, не имеют отношения к вопросу, но могут добавить их при необходимости).

Я нашел это статья об использовании делегата и протокола для потенциально достижения sh того, что мне нужно, но я продолжаю получать crypti c cra sh при сборке - это может быть из-за моего незнания, где и как определить / инициализировать протокол в этом конкретном c использовании.

Спасибо за помощь!


ViewController.swift (removed non-essential parts for simplicity)

```
import UIKit

class ViewController: UIViewController {

    var videoCameraWrapper : OpenCVWrapper!
    @IBOutlet weak var imageView: UIImageView!    

    override func viewDidLoad() {
        super.viewDidLoad()
        self.videoCameraWrapper = OpenCVWrapper(imageView:imageView)    // Call wrapper
        self.videoCameraWrapper.startCamera()        
    }

    //
    // Is there a function that can put put here to get called when the CV detection is done?
    //
}
```


OpenCVWrapper.mm


```

#import "OpenCVWrapper.h"
#import <opencv2/videoio/cap_ios.h>
using namespace cv;

@interface OpenCVWrapper () <CvVideoCameraDelegate>

@end


@implementation OpenCVWrapper
{
    CvVideoCamera * videoCamera;
}

-(id)initWithImageView:(UIImageView*)iv
{
    videoCamera = [[CvVideoCamera alloc] initWithParentView:iv];
    videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
    videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
    videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
    videoCamera.defaultFPS = 30;
    videoCamera.grayscaleMode = NO;
    videoCamera.delegate = self;
    return self;
}


#ifdef __cplusplus
- (void)processImage:(Mat&)image
{

    Mat image_copy;
    cvtColor(image, image_copy, COLOR_BGRA2BGR);

    /* Doing CV detection here - it is working correctly - keeping track of number & type of objects detected.  Below, need to move to ResultsViewController.swift view if a certain number of objects are detected. */

    if (num_objects_detected > threshold) {

        // How to go to new screen (ResultsViewController.swift), and send some of this CV data there?

    }

}
#endif


-(void)startCamera
{
    [videoCamera start];
}

-(void)stopCamera
{
    [videoCamera stop];
}
@end

```

...