質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

466閲覧

オブジェクトトラッキング

cer

総合スコア9

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/08/12 15:17

前提・実現したいこと

iPad/iPhoneを定点カメラの様に置き、1分間で何個コンベア上の物が通過していったかを動画解析(オブジェクトトラッキング)を使って計測出来るアプリを作りたい。

swiftを習い始めたばかりなので知識がほぼありません。
オブジェクトの検出は出来ず、1分間で何個コンベア上に物が通過したかのコード等何から手を付ければ良いのか分かりません。
親切な方ご教授の程よろしくお願い致します。

試したこと

https://www.gaprot.jp/gaprot-x-chogiken/vision-framework
に掲載されているコードを引用してオブジェクトの検出と追跡をやってみて上記のエラーが出て検出も追跡も出来なかった。

該当コード・エラーメッセージ

let backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back), エラー:Type 'String!' has no member 'video' private lazy var previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) エラー:Instance member 'captureSession' cannot be used on type 'ViewController' previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill エラー:Type 'AVLayerVideoGravity' (aka 'NSString') has no member 'resizeAspectFill'

全体のソースコード

swift

1import UIKit 2import Vision 3import AVFoundation 4 5class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate { 6 7private lazy var captureSession: AVCaptureSession = { 8 let session = AVCaptureSession() 9 guard 10 let backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back), 11 let input = try? AVCaptureDeviceInput(device: backCamera) 12 else { return session } 13 session.addInput(input) 14 return session 15}() 16 17private lazy var previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 18 19override func viewDidLoad() { 20 super.viewDidLoad() 21 22 let videoOutput = AVCaptureVideoDataOutput() 23 videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "Queue")) 24 captureSession.addOutput(videoOutput) 25 captureSession.startRunning() 26 27 view.layer.addSublayer(previewLayer) 28} 29 30override func viewDidLayoutSubviews() { 31 super.viewDidLayoutSubviews() 32 previewLayer.frame = self.view.bounds 33 previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 34} 35 36private lazy var highlightView: UIView = { 37 let view = UIView() 38 view.layer.borderColor = UIColor.white.cgColor 39 view.layer.borderWidth = 4 40 view.backgroundColor = .clear 41 return view 42}() 43 44private var requestHandler: VNSequenceRequestHandler = VNSequenceRequestHandler() 45private var lastObservation: VNDetectedObjectObservation? 46private var isTouched: Bool = false 47 48override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 49 highlightView.frame = .zero 50 lastObservation = nil 51 isTouched = true 52} 53 54override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 55 guard let touch: UITouch = touches.first else { return } 56 highlightView.frame.size = CGSize(width: 120, height: 120) 57 highlightView.center = touch.location(in: view) 58 isTouched = false 59 var convertedRect = previewLayer.metadataOutputRectOfInterest(for: highlightView.frame) 60 convertedRect.origin.y = 1 - convertedRect.origin.y 61 lastObservation = VNDetectedObjectObservation(boundingBox: convertedRect) 62} 63 64 func captureOutput(_ output: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { 65 guard 66 let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer), 67 let lastObservation = self.lastObservation 68 else { 69 requestHandler = VNSequenceRequestHandler() 70 return 71 } 72 73 if self.isTouched { return } 74 75 let request = VNTrackObjectRequest(detectedObjectObservation: lastObservation, completionHandler: update) 76 request.trackingLevel = .accurate 77 do { 78 try requestHandler.perform([request], on: pixelBuffer) 79 } catch { 80 print("Throws: (error)") 81 } 82} 83 84private func update(_ request: VNRequest, error: Error?) { 85 DispatchQueue.main.async { 86 guard let newObservation = request.results?.first as? VNDetectedObjectObservation else { return } 87 self.lastObservation = newObservation 88 guard newObservation.confidence >= 0.3 else { 89 self.highlightView.frame = .zero 90 return 91 } 92 var transformedRect = newObservation.boundingBox 93 transformedRect.origin.y = 1 - transformedRect.origin.y 94 let convertedRect = self.previewLayer.rectForMetadataOutputRect(ofInterest: transformedRect) 95 self.highlightView.frame = convertedRect 96 } 97 } 98}

補足情報(FW/ツールのバージョンなど)

Xcode(Ver9.4.1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単に同じものが通過した数だけをカウントしたいだけであれば、そのもの自体を認識する必要はなく、例えば、ものとものの間に隙間がある前提で、背景を遮断されたことをカウントするだけで良いことになります。
その場合、二値化するだけで良いかもしれません。
如何に課題を簡単にするかも検討してみると良いかと思います。

ちなみに、コードについてですが、コピペした範囲では問題がないので、XCode上に記載しているコードに問題があるのではないでしょうか。
途中で全角スペースが入ってしまっているとか。

投稿2018/08/13 02:05

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問