一:我们需要在Main.storyboard中拉出来label和button和imageView
如下图所示 :
1:在红框的位置选取button和label和imageView

2:之后将imageView拖拉进去,如下图所示

3:接下来,我们按照上面的方法来把button和label也放到imageView的上面,最终的效果图如下:

4:然后我们为了适配大多数的iphone机型,我们来给button添加限制条件
我们先给imageView添加限制条件吧!
在左下角的第二个按钮我们限制图片的width和height分别为374和816,距离手机上部距离为40,下部距离为6,左右距离为20

5:我们给label和button也加上这样的限制


6:为了能够直观地看到button和label我们来改变这两个控件的颜色
在background中设置它的属性

7:完成之后,我们点击那个双圆圈按钮切换到双页面,按住control键拖拉storyboard中的控件到代码里面,并且设置按钮的名字。


完成了storyboard之后,在代码端是下面这个样式

二:接下来我们的操作
(1):我们把训练好的模型导入到我们的project中(拖拉到页面右端)

(2):接下来我们给两个button添加点击事件
//当点击拍照时调用takephoto这个方法
camer_button.addTarget(self, action: #selector(takephoto), for: .touchUpInside)
//当点击从相册中选择的时候调用chooseImageFromLibrary这个方法
photos_button.addTarget(self, action: #selector(chooseImageFromLibrary), for: .touchUpInside)
(4):接着我们在chooseImageFromLibrary中实现从相册中获取图片的功能
@objc func chooseImageFromLibrary(_ sender: Any) {
//判断是否可以打开相册
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) {
//调用打开相册权限的函数
let imagePicker = UIImagePickerController()
//设置代理
imagePicker.delegate = self
//设置控制器的类型---相册
imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
//图片不允许编辑
imagePicker.allowsEditing = false
//跳转到控制器---相册
self.present(imagePicker,animated: true,completion: nil)
}
}
三:我们选取图片之后,开始通过我们导入的模型来分析选中的图片,我们在imagePickerController这个函数中实现
//获取图片后的操作
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
//获取图像
if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
display_label.text = "分析中"
//图片填充模式--等比例缩放图片
image.contentMode = .scaleToFill
image.layer.masksToBounds = true
//在imageView上显示获取到的图片
image.image = pickedImage
//加载模型
guard let model = try? VNCoreMLModel(for:ImageClassifier().model) else {
fatalError("无法加载训练模型")
}
//创建一个模型请求
let requset = VNCoreMLRequest(model: model) {
[weak self] requesst,error in guard let results = requesst.results as? [VNClassificationObservation],
let topResult = results.first else {
fatalError("失败")
}
//主线程更新UI
DispatchQueue.main.async {
print(topResult)
//显示识别的结果
self!.display_label.text = "识别的结果是:\(Int(topResult.confidence*100))%是\(topResult.identifier)"
//if topResult.confidence < 0.99{
// self!.display_label.text = "识别的结果是:\(Int(topResult.confidence*100))%是\(topResult.identifier)"
//}
//else {
// self!.display_label.text = "识别的结果是:非猫非狗"
}
}
}
//将获取到的图片转换为CIImage类型作为参数传递给模型
guard let ciImage = CIImage(image: pickedImage) else {
fatalError("不能获取选择到的图片")
}
//运行图片分类识别器
let handler = VNImageRequestHandler(ciImage: ciImage)
DispatchQueue.global().async {
do {
try handler.perform([requset])
}
catch {
print(error)
}
}
}
picker.dismiss(animated: true, completion: nil)
}
最后,也是最重要的事情,需要在Info.plist中加入调用相机的权限

网友评论