编辑代码

//
//ViewController.swift
CameraUsage
Created by Zhifeng Chen on 2020/8/2.
Copyright 2020 Zhifeng Chen. A11 rights reserved.
import UIKit
class ViewController: UTViewController,UINavigationControllerDelegate UIImagePickerControllerDelegatel
//设置图像显示用的Outlet,就是变量carImageView
@IBOutlet weak var carImageView: UITmageView!
//显示识别出来的车辆名称型号
@IBOutlet weak var carName: UILabel!
//显示该车辆百度百科里面的简介
@IBOutlet weak var carDetails: UILabel!
//设置Action,由相册按钮事件触发
IBAction func onLibrary(sender: UIButton)
// 设置相册拍照的控制器
let vc = UIImagePickerController()
//设置为相册
vc,sourceType =.photoLibrary
vc.allowsEditing = true
vc.delegate = self
present(vc, animated: true)
一
//设置Action,由拍照按钮事件触发
IBAction func onCamera( sender: UIButton)
let vc = UIImagePickerController()
//设置为摄像头
vc.sourceType = .camera
vc.allowsEditing = true
vc.delegate = self
present(vc, animated: true)
//相册获取图片需要调用的Delegate
func imagepickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.Infokey: Any])( picker.dismiss(animated:true)
guard let image = info[.editedImage]as? UIImage else
return
// 将相册图片显示在carImageView中
carImageView.image - image
//获得百度AI平台的access_token
let access_token =get_baidu_token()
if access_token ==""
return
else
//从百度AI获得车型信息
get_car_type(access_token:access_token)
//传入有效的access_token,上传图片,获得车型信息
func get_car_type(access_token:String)i
//获取显示的图片,并保存为jpg格式
let image = carImageView.image
//let data = UIImagePNGRepresentation(image)
guard let data = image!.jpegData(compressionQuality:0.5) else l return
// 将图片进行 base64 编码
let data base64 str = data.base64Encodedstring()
//准备好获取车型的API的URL的字符串
let carT'ype_host = "https://aip.baidubce.com/rest/2.0/image-classify/vl/car" +"?access token="+"\(access_token)"
//从字符串转换为 URL
if let url - URL(string:carType_host)(
//从URL 生成URLRequest
var request = URLRequest(url:url)
//设置HTTP HEADER中的Content-Type为application/x-www-form-urlencoded
request.setValue("application/x-www-form-urlenooded",forHTTPHeaderField:"Content-Type")
// 设置为 POST 方法
request.httpMethod="PosT"
// 将图片文件进行 urlencode 转码
let cs = NSCharacterSet(charactersIn:"/=+号").invertedlet image_urlEncode = data_base64_str.addingPercentEncoding(withAllowedCharacters:cs)
//合并三个参数为一个字符串
let postString ="image=\(image_ur)Encode!)&top_num-5&balke_nume1'// 将字符串转为 UTF8 类型的数据
request.httpBody=poststring.data(using:.utf8)
//URLSession 调用
URLSession.shared.dataTask(with:request)((data, response error) in
if error = nil
print("error")
)
elge f
if let json = try? JSONSezialization,jsonObject (with:
datal, options:.allowFragments)as?String: Any] (
et result = json["result"] as! ArrayeDictionarye
String,Any>
let name = result 0]["name"l as! String
var description="非车类”
if name !="非车类”
let baike info -result [0] ("baike_info"] as!
Dictionary<String,String>
if lct details = baike_info[”description"
description -details
)
elsei
description=”百度百科无此车资料
一
//转入主线程
DispatchQueue.main.async l
self.carDetails.text = description
self.carName.text = name
.resume ()
//以信号量方式等待网络结果返回access_token,如果没有成功,则返回"”func get_baidu_token()->String f
let API_Key ="EIpAlhdD7i5152EsiNqpU0F1"
let Secret Key="p8EZWg4aqjDOxABmKvBYSNyZ1YzGFqbm"
let token host="https://aip.baidubce.com/oauth/2.0/token?granttype=client_credentials&client id=\(API Key)&client_secret=\(Secret_Key)"
var access token = ""
//设置信号量
let semaphore: DispatchSemaphore = DispatchSemaphore(value: 0)
if let url = URL(string: token_host)
URLSession.shared.dataTask(with:url)((data, response, error) in if error l=nil {
print("network error")
}
else {
if let ison = trv? JSONSerialization.isonObject(with:
data!, options:.allowFraaments) as?[String:Any] i
access token =json["access_token"] as! String
)
一
//发出信号量
semaphore.signal()
.resume()
)
else {
print("url error")
}
//等待信号量
semaphore,wait()
return access_token
}
  }