Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何停止在swift中检测对象?_Ios_Swift_Machine Learning_Text To Speech_Coreml - Fatal编程技术网

Ios 如何停止在swift中检测对象?

Ios 如何停止在swift中检测对象?,ios,swift,machine-learning,text-to-speech,coreml,Ios,Swift,Machine Learning,Text To Speech,Coreml,我目前正在从事IOS移动项目,在这个项目中,物体在一个帧中被检测出来,然后被转换成语音来帮助视力受损的人。我的应用程序已经检测到帧中的对象,但一旦检测到,它就不会停止检测。当我试图将对象名转换为语音时,它会一次又一次地重复相同的名称 为了澄清,当我将相机指向一张“椅子”时,它给出了100多张椅子的日志,其中文本到语音必须在转到下一个对象之前说出这100张“椅子” 这是我的viewController代码: 导入UIKit 进口视觉 导入CoreMedia 进口AVF基金会 类ViewContro

我目前正在从事IOS移动项目,在这个项目中,物体在一个帧中被检测出来,然后被转换成语音来帮助视力受损的人。我的应用程序已经检测到帧中的对象,但一旦检测到,它就不会停止检测。当我试图将对象名转换为语音时,它会一次又一次地重复相同的名称

为了澄清,当我将相机指向一张“椅子”时,它给出了100多张椅子的日志,其中文本到语音必须在转到下一个对象之前说出这100张“椅子”

这是我的
viewController
代码:

导入UIKit
进口视觉
导入CoreMedia
进口AVF基金会
类ViewController:UIViewController{
@IBVAR视频预览:UIView!
@IBOUTLE弱var BOX视图:DrawingBoundingBoxView!
@IBVAR labelsTableView:UITableView!
@IBOutlet弱var推断标签:UILabel!
@IbVar etimeLabel:UILabel!
@iblabel:UILabel!
让objectdetectionmodel=mobilenetw2\u SSDLite()
//MARK:-视觉特性
var请求:VNCoreMLRequest?
var visionModel:VNCoreMLModel?
var Isinference=false
//标记:-AV属性
视频捕捉:视频捕捉!
让信号量=分派信号量(值:1)
var lastExecution=Date()
//标记:-表视图数据
var预测:[VNRecognizedObjectObservation]=[]
//标记-性能度量属性
私有let measure=measure()
设maf1=MovingAverageFilter()
设maf2=MovingAverageFilter()
设maf3=MovingAverageFilter()
//MARK:-查看控制器生命周期
重写func viewDidLoad(){
super.viewDidLoad()
//设置模型
setUpModel()
//设置摄像机
设置摄影机()
//为性能度量设置代理
measure.delegate=self
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
self.videoCapture.start()文件
}
覆盖函数视图将消失(u动画:Bool){
超级。视图将消失(动画)
self.videoCapture.stop()
}
//标记:-设置核心ML
func setUpModel(){
如果让visionModel=try?VNCoreMLModel(适用于:ObjectDetectionModel.model){
self.visionModel=visionModel
request=VNCoreMLRequest(型号:visionModel,completionHandler:visionRequestDidComplete)
请求?.imageCropAndScaleOption=.scaleFill
}否则{
fatalError(“未能创建愿景模型”)
}
}
//马克:-设置视频
func setUpCamera(){
视频捕获
videoCapture.delegate=self
videoCapture.fps=30
videoCapture.setUp(会话预置:.vga640x480){成功
如果成功{
//在图层上添加预览视图
如果让previewLayer=self.videoCapture.previewLayer{
self.videoPreview.layer.addSublayer(预览层)
self.resizePreviewLayer()的大小
}
//安装完成后开始视频预览
self.videoCapture.start()文件
}
}
}
重写func viewdilayoutsubviews(){
super.viewDidLayoutSubviews()
resizePreviewLayer()
}
func resizePreviewLayer(){
videoCapture.previewLayer?.frame=videoPreview.bounds
}
}
//MARK:-VideoCaptureDelegate
扩展视图控制器:VideoCaptureDelegate{
func videoCapture(capture:videoCapture,didCaptureVideoFrame pixelBuffer:CVPixelBuffer?,时间戳:CMTime){
//从相机捕获的图像包含在pixelBuffer中
如果!self.isinference,则让pixelBuffer=pixelBuffer{
self.isinference=true
//开始测量
self.measure.start()
//预测!
self.predictUsingVision(像素缓冲区:像素缓冲区)
}
}
}
扩展视图控制器{
func predictUsingVision(pixelBuffer:CVPixelBuffer){
guard let request=request else{fatalError()}
//vision framework根据模型的输入配置自动配置图像的输入大小
self.semaphore.wait()
let handler=VNImageRequestHandler(cvPixelBuffer:pixelBuffer)
try?handler.perform([请求])
}
//标记:-后处理
func visionRequestDidComplete(请求:VNRequest,错误:error?){
self.measure.labell(带“endInference”)
如果let predictions=request.results as?[VnRecognitizedObjectObservation]{
//打印(预测。第一个?标签。第一个?标识符??“无”)
//打印(预测。第一?标签。第一?置信度???-1)
让pred=request.results?首先
//打印(pred)
//打印(预测。第一个?标签。第一个?标识符,如有)
//打印(预测)
自我预测=预测
DispatchQueue.main.async{
self.boxesView.predictedObjects=预测
self.labelsTableView.reloadData()
//措施结束
self.measure.end()
self.isinference=false
}
}否则{
//措施结束
self.measure.end()
self.isinference=false
}
self.semaphore.signal()
}
}
扩展ViewController:UITableViewDataSource{
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回预测。计数
}