1. 程式人生 > >vins-mobile程式碼解析1:viewDidLoad

vins-mobile程式碼解析1:viewDidLoad

重要物件和結構說明:

  • CvVideoCamera* videoCamera:opencv提供的一個讀取相機資料並轉成cv::Mat格式的介面
  • BOOL isCapturing:初始化好後,這個狀態變數設定為true,processImage開始處理影象
  • cv::Ptr<FeatureTracker> feature_tracker:FeatureTracker負責光流跟蹤特徵,詳見vins相關的文件
  • cv::Size frameSize:像機輸出的影象大小
  • uint64_t prevTime;
  • NSCondition *_condition;
  • NSThread *mainLoop:迴圈呼叫process
  • NSThread *draw:視覺化執行緒
  • NSThread *saveData:把img和IMU存到documents資料夾
  • NSThread *loop_thread
  • NSThread *globalLoopThread
  • UIImageView* imageView

  • UIImageView* featureImageView

  • struct IMU_MSG

  • struct IMG_MSG

  • struct IMG_DATA

  • struct IMG_DATA_CACHE

  • struct VINS_DATA_CACHE

入口函式:ViewController.mm的viewDidLoad

  • 初始化成員變數:CvVideoCamera* videoCamera
    • 生成CvVideoCamera物件需要提供一個預覽控制元件
      • @property (nonatomic, strong) IBOutlet UIImageView* imageView;

    • self.videoCamera.delegate = self
      • 設定delegate
      • delegate物件需要繼承CvVideoCameraDelegate
      • delegate物件需要實現processImage函式,用於回撥收到的影象
    • 還可以設定一些其他的相機屬性,具體參照CvAbstractCamera的定義
    • 一些高階的屬性需要獲取device來設定,比如曝光時間等。
    • AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; [device lockForConfiguration:&error]; [device setExposureTargetBias:ev completionHandler:^(CMTime syncTime) {}];     device.exposureMode = AVCaptureExposureModeCustom; [device unlockForConfiguration];
    • 最後呼叫start函式開始接受影象

  •  對imageView設定各種手勢

    • UIPanGestureRecognizer *resultPanGestureRecognizer =               [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.imageView addGestureRecognizer:resultPanGestureRecognizer];

    • handlePan是回撥函式

  • feature_tracker = new FeatureTracke

  • 設定UIActivityIndicatorView *indicator,就是開頭那個初始化指引相關的

  • 初始化幾個執行緒

  • 檢查裝置

    • 判斷不同ios裝置設定不同的相機內參和imu相機變換