@ml2022 ml2022 / ContentView.swift
Created at Wed Dec 14 19:03:31 JST 2022
VideoCapture版
ContentView.swift
Raw
/
//  ContentView.swift
//  VideoCapture
//
//  https://zenn.dev/yorifuji/articles/swiftui-avfoundation
//

import SwiftUI
import AVFoundation
import CoreMotion

struct ContentView: View {
    let videoCapture = VideoCapture()
    let motionManager = CMMotionManager()
    @State var x = 0.0
    @State var y = 0.0
    @State var z = 0.0
    @State var px = 5.0
    @State var py = 5.0
    @State var pz = 5.0
    
    @State var image: UIImage? = nil
    @ObservedObject var classifier: ImageClassifier = ImageClassifier() //他の所から使いまわせる変数の定義
    
    //画面の表示の定義
    var body: some View {
        VStack {
            if let image = image {
                Image(uiImage: image)
                    .resizable()
                    .scaledToFit()
            }
            
/* 認識ができたら選択肢が出るボタン、やり直しの2つを認識ができた時の処理として埋め込んでおく必要性がある
 常時出るrunとstopは変更しなければいけないなので
 if(  if image != nil){
 HStack {
     Button("Retry") {
         videoCapture.run { sampleBuffer in
             if let convertImage = UIImageFromSampleBuffer(sampleBuffer) {
                 DispatchQueue.main.async {
                     self.image = convertImage
                 }
             }
         }
     }
     //stopボタンを押して読み込んでいた処理をフレーム
 font(.largeTitle)
 
 if let imageClass = classifier.imageClass{
     Text(imageClass).font(.largeTitle) //実験器具表示
 
 }
}
 */
            //ボタンの配置の定義
            HStack {
                Button("run") {
                    start()
                    videoCapture.run { sampleBuffer in
                        if let convertImage = UIImageFromSampleBuffer(sampleBuffer) {
                            DispatchQueue.main.async {

                                self.image = convertImage
                            }
                        // ----- ここを制限
                            if image != nil{
                                classifier.detect(uiImage: image!)//ストップボタンを押した時Image
                            }
                        // ------
                        }
                    }
                }
                //stopボタンを押して読み込んでいた処理をフレーム
                Button("stop") {
                    videoCapture.stop()
//                    if image != nil{
//                        classifier.detect(uiImage: image!)//ストップボタンを押した時Image
//                    }

                }
            }
            .font(.largeTitle)
            if let imageClass = classifier.imageClass{
                Text(imageClass).font(.largeTitle) //実験器具表示
            }
            Text("accX: \(x)")
            Text("accY: \(y)")
            Text("accZ: \(z)")
        }
    }

    func UIImageFromSampleBuffer(_ sampleBuffer: CMSampleBuffer) -> UIImage? {
        if let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
            let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
            let imageRect = CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixelBuffer), height: CVPixelBufferGetHeight(pixelBuffer))
            let context = CIContext()
            if let image = context.createCGImage(ciImage, from: imageRect) {
                return UIImage(cgImage: image)
            }
        }
        return nil
    }
    func start() {
            if motionManager.isDeviceMotionAvailable {
                motionManager.deviceMotionUpdateInterval = 1.0
                motionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: {(motion:CMDeviceMotion?, error:Error?) in
                    self.updateMotionData(deviceMotion: motion!)
                })
            }
        }
        
    func updateMotionData(deviceMotion: CMDeviceMotion) {
//            x = deviceMotion.userAcceleration.x
//            y = deviceMotion.userAcceleration.y
//            z = deviceMotion.userAcceleration.z
        px = x
        py = y
        pz = z
        x = deviceMotion.attitude.pitch
        y = deviceMotion.attitude.roll
        z = deviceMotion.attitude.yaw
//            print("x= \(x)")
//            print("y= \(y)")
//            print("z= \(z)")
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}