编辑代码

争做车型识别达人第
importrequests
import base64

车型识别
````

request "https://alp.baldubce.com/rest/2.0/1mage-classify/v1/car" 二进制方式打开图片文件
#
f= open('(本地文件]’,‘rb’)
img = base64,b64encode(f.read())
params ("image"timg,"top num":5)
access _token =【调用鉴权接口获取的token)”
request_url = request_url +"?accesstoken=" + access token headers ('content-type':'application/x-wwx-form-urlencoded' response = requests.post (request_url, data-params, headers=headers) if response:
print (response.json())
返回的JSON数据:
"1og_id”:4086212218842203806,
"location result":
"width":447,
"top":226,
"height":209,
"left":188
"result":[t
"baike_info":i
"baike url":"htto://baike.baidu.com/item/8E58B8883号E58A8A0E88BF8AAChiron/20419512",
“descrintion":"布加迪 Chiron是法国跑车品牌布加迪出品的豪华超跑车。配置四满轮增压发动机,420 公里每小时,有23种颜色的选择,售价高达260万美元。”
'gcore":0.98793351650238,
"name";”布加迪Chiron""year”:“无年份信息“
"score":0.0021970034576952
"name":“奥迪RS5""year":"2011-2017”
},
{
  "score":0.0021096928976476,
  "name":"奥迪RS4"
"year":”无年份信息”
},
"score":0.0015581247862428,
"name":"奥迪RS7",
"year":"2014-2016"
"score":0.00082337751518935,
"name":“布加迪威航”,
"year":"2004-2015"
],
"color result":”颜色无法识别”]
}

{
"coord":("lon":-0.13,"lat":51.51),
"weather":[("id":300, "main":"Drizzle","description":"1ightintensitydrizzle","icon":"09d"j],
"base":"stations",
"main":f
"temp":280.32,
"pressure":1012,
"humidity":81,
"temp min":279.15,
"temp max":281.15
},
"visibility":10000,
"wind":("speed":4.1,"deg":801,
"clouds":("all":901,
"dt":1485789600,
"sys":(
"type":1,
"id":5091,
"message":0.0103,
"country":"GB",
"sunrise":1485762037,
"sunset":1485794875
,
"id":2643743,
"name":"London"
"cod":200
}

{
"coord":("lon":-0.13,"lat":51.51),
"weather":[("id":300, "main":"Drizzle","description":"1ightintensitydrizzle","icon":"09d"j],
"base":"stations",
"main":f
"temp":280.32,
"pressure":1012,
"humidity":81,
"temp min":279.15,
"temp max":281.15
},
"visibility":10000,
"wind":("speed":4.1,"deg":801,
"clouds":("all":901,
"dt":1485789600,
"sys":(
"type":1,
"id":5091,
"message":0.0103,
"country":"GB",
"sunrise":1485762037,
"sunset":1485794875
,
"id":2643743,
"name":"London"
"cod":200
}

func sessionGetData(){
//创建URL对象
let urlString ="http://www.tuling123.com/”
let url= URL(string:urlString)
// 创建请求对象
let request = URLRequest(url:url!)
let session = URLSession.shared
let dataTask = session.dataTask(with: request,
completionHandler: ((data, response, error) -> Void in if error != nil(
print(error.debugDescription)
jelse(
let str = String(data: data!, encoding:
String.Encoding.utf8)
print(str!)
一
)as URLSessionTask
/ / 使用 resume 方法启动任务
dataTask.resume()
}

fun csessionDownloadImage(){
//下载地址
let url=URL(string: "http://hangge.com/blog/images/logo.png")//请求
let request = URLRequest(url: url!)
let session = URLSession.shared
//下载任务
let downloadTask = session.downloadTask(with: request, completionHandler:
(location:URL?, response:URLResponse?,error:Error?)
-> Void in
//输出下载文件原来的存放目录
print("location:\(String(describing: location))")//location位置转换
let locationPath = location?.path
//获取当前时间
let now = NSDate()
//当前时间的时间戳
let timeInterval:TimeInterval = now.timeIntervalSince1970let timeStamp = String(timeInterval)
//拷贝到用户目录
let documents:String =NSHomeDirectory()+"/Documents/ (timeStamp).png"
//创建文件管理器
let fileManager = FileManager.default
try! fileManager.moveItem(atPath: locationPath!, toPath: documents)
print("new location:\(documents)")
})
// 使用 resume 方法启动任务
downloadTask.resume()
}


<?php
/** php 接收流文件
* @eparam String Sfile 接收后保存的文件名
*  @return  boolean
*/
function receivestreamFile($receiveFile){
$streamData = isset(SGLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP RAWPOST DATA'J:";
if(empty($streamData)){
    $streamData =file_get_contents('php://input');
}
if($streamData!=1"){
ret = file put contents($receiveFile, $streamData, true);
 }else{
ret =false;
 }
return Sret;
}
//定义服务器存储路径和文件名
sreceiveFile =$_SERVER["DOCUMENT_ROOT"]."/uploadFiles/swift.png"; echo $receiveFile;
Sret = receiveStreamFile($receiveFile);
echo json_encode(array('success'=>(bool)sret));
?>
fun  csessionUploadPhp()(
//上传地址
let url = URL(string: "http://localhost/uploadSwift.php")//1.创建会话对象
let session = URLSession. shared
//请求
var request =URLRequest(url:url!, cachePolicy: .reloadIgnoringCacheData) request.httpMethod ="POST"
//上传数据流
let fileImage =Bundle.main.path(forResource:"beel", ofType:"png") let imgData = try! Data(contentsOf:URL(fileURLWithPath: fileImage!))
let uploadTask = session.uploadTask(with: request as URLRequest, from: imgData) 一
(data:Data?, response:URLResponse?, error:Error?) -> Void in//上传完毕后
if error !=nil(
print(error!)
else(
let str = String(data: data!, encoding: String.Encoding.utf8)print("上传完毕:\(String(describing: str))")
一
//使用 resume 方法启动任务
uploadTask.resume()
}

import UIKit
import Foundation
let API_Key= "EIpAlhdD715152Es1NqpU0F"
let Secret Key ="p8EZNg4agjDOxABmKvBYSNyZ1Y2GFqb_”
lettoken host "https://aip.baidubce.com/oauth/2.0/token?granttype=client_credentialskclfent_id=\(API_Key)&client_secret=\(Secret Key)"
var access token
var expires in :Int32=0
if let url= URL(string: token host)
一
URLSession.shared.dataTask(with: url) (data, response, error) in if error !=nil (
print("network error")
)
else
if let ison = try? JSONSeralization.fsonObject(with: data! options: .allowFragment.s) as? [String:Anyl 一
access token = json["access_token"] as! String
expizes_in - json["expiros_in"] as! Int32
print(" -access coken------")
print(access_token)
print("- -----expires time------")
print(expires_in)
.resume()
}
else{
print("url error")
}

//以文本或者二进制方式读入源程序文件的Loader
public struct Loaderstatic func readTxt(file url:URL)->String?doletsource=tryString(contentsOf: url) return sourcecatchreturn nil
一
一
staticfunc readBin(file url:URL)-> Data?
doletdata = try Data(contentsOf: url) return datacatch
return nil
}
}
}

//Resources中的文件,并把路径转化为URL
let path = Bundle,main.path(forResource: "qrcar.jpg", ofType: nil) let url = URL(fileURLWithPath:path!)
let data = Loader.readBin(file: url)
if(data == nil)
print("File failed to load")
let data base64 str = data?.base64EncodedString()
let data base64 = data?.base64EncodedData()
access token ="24.2ec96a68f74a8429b0f07869929413ae.2592000.1598921312.282335-21737249"
let carType host = Whttps://aip.baidubce.com/rest/2.0/image-classify/v1/car"+"?access_token="+"\(access_token)"
if let url = URL(string: carType_host) {
    var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod="POST"
let cs = NSCharacterSet(charactersIn:"/=+g").inverted
let image_urlEncode = data base64 str!.addingPercentEncoding(withA1lowedCharacters:cs)
let postString ="image=\(image urlEncode!)&top_num=5&baike_num=1"
request.httpBody=poststring.data(using:.utf8)
URLSession.shared.dataTask(with:request)((data, response, error) in
if error != nil [
print("error")
else [
let rs = String(data:data!, encoding: String.Encoding.utf8)
print(rs!)
.resume()
}
{
    Created by zhifeng chen on 2020/8/2.
Copyright 2020 Zhifeng Chen. Al1 rightsreserved.
import UIKit
class Viewcontroilar, ntvtescontroller UINavigationControllerDelegate UIImagePickerControllerDelegate(
//设置图像显示用的Outlet,就是变量carImageView
@IBOutlet weak var carImageview: UIImageView!
//设置Action,由相册按钮事件触发
IBAction fune ontibrary( 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 = UTImagePickerController()
//设置为摄像头
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
// 将相册图片显示在 carImageViewcarImageView.image = image
}
}

//
//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
// 将相册图片显示在carImageViewcarImageView.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()
//准备好获取车型的APIURL的字符串
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-Typeapplication/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(withurl)((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
}
  }