質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

2935閲覧

SwiftでGoogle Vision APIを使用してOCRした文字情報をテキストビューに表示する方法

sunsetblue

総合スコア14

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/01/02 05:20

編集2019/01/03 01:08

SwiftでGoogle Vision APIを使用してOCRした文字情報をテキストビューに表示する方法

画像の文字情報をOCRするiOSアプリを作成しています。

下記GitHubのページとQiitaのページを参照しましたが、OCRした文字情報がlabelResultsに表示されず、
Xcodeのコンソールに表示されています。
OCRをすると、「labelResults」テキストビューに、下記コードの「request.httpBody = data」以下が表示されます。
どのようにすればよいかご教授いただけないでしょうか。

GitHub:https://github.com/GoogleCloudPlatform/cloud-vision/tree/master/ios
Qiita:https://qiita.com/ahpjop/items/a36817bc5d8e25e634e3

Swift

1 2import UIKit 3import SwiftyJSON 4 5 6class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 7 let imagePicker = UIImagePickerController() 8 let session = URLSession.shared 9 10 @IBOutlet weak var imageView: UIImageView! 11 @IBOutlet weak var spinner: UIActivityIndicatorView! 12 @IBOutlet weak var labelResults: UITextView! 13 @IBOutlet weak var faceResults: UITextView! 14 15 var googleAPIKey = "YOUR_API_KEY" 16 var googleURL: URL { 17 return URL(string: "https://vision.googleapis.com/v1/images:annotate?key=(googleAPIKey)")! 18 } 19 20 @IBAction func loadImageButtonTapped(_ sender: UIButton) { 21 imagePicker.allowsEditing = false 22 imagePicker.sourceType = .photoLibrary 23 24 present(imagePicker, animated: true, completion: nil) 25 } 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 // Do any additional setup after loading the view, typically from a nib. 30 imagePicker.delegate = self 31 labelResults.isHidden = true 32 faceResults.isHidden = true 33 spinner.hidesWhenStopped = true 34 } 35 36 override func didReceiveMemoryWarning() { 37 super.didReceiveMemoryWarning() 38 // Dispose of any resources that can be recreated. 39 } 40} 41 42 43/// Image processing 44extension ViewController { 45 46 func analyzeResults(_ dataToParse: Data) { 47 48 // Update UI on the main thread 49 DispatchQueue.main.async(execute: { 50 51 52 // Use SwiftyJSON to parse results 53 let json = JSON(data: dataToParse) 54 let errorObj: JSON = json["error"] 55 56 self.spinner.stopAnimating() 57 self.imageView.isHidden = true 58 self.labelResults.isHidden = false 59 self.faceResults.isHidden = false 60 self.faceResults.text = "" 61 62 // Check for errors 63 if (errorObj.dictionaryValue != [:]) { 64 self.labelResults.text = "Error code (errorObj["code"]): (errorObj["message"])" 65 } else { 66 // Parse the response 67 print(json) 68 let responses: JSON = json["responses"][0] 69 70 71 // Get label annotations 72 let labelAnnotations: JSON = responses["textAnnotations"] 73 let numLabels: Int = labelAnnotations.count 74 var labels: Array<String> = [] 75 if numLabels > 0 { 76 77 var labelResultsText:String = "Labels found: " 78 for index in 0..<1 { 79 let label = labelAnnotations[index]["description"].stringValue 80 labels.append(label) 81 } 82 for label in labels { 83 // if it's not the last item add a comma 84 if labels[labels.count - 1] != label { 85 labelResultsText += "(label), " 86 } else { 87 labelResultsText += "(label)" 88 } 89 } 90 self.labelResults.text = labelResultsText 91 } 92 } 93 }) 94 95 } 96 97 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 98 if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 99 imageView.contentMode = .scaleAspectFit 100 imageView.isHidden = true // You could optionally display the image here by setting imageView.image = pickedImage 101 spinner.startAnimating() 102 faceResults.isHidden = true 103 labelResults.isHidden = true 104 105 // Base64 encode the image and create the request 106 let binaryImageData = base64EncodeImage(pickedImage) 107 createRequest(with: binaryImageData) 108 } 109 110 dismiss(animated: true, completion: nil) 111 } 112 113 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 114 dismiss(animated: true, completion: nil) 115 } 116 117 func resizeImage(_ imageSize: CGSize, image: UIImage) -> Data { 118 UIGraphicsBeginImageContext(imageSize) 119 image.draw(in: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height)) 120 let newImage = UIGraphicsGetImageFromCurrentImageContext() 121 let resizedImage = UIImagePNGRepresentation(newImage!) 122 UIGraphicsEndImageContext() 123 return resizedImage! 124 } 125} 126 127 128/// Networking 129extension ViewController { 130 func base64EncodeImage(_ image: UIImage) -> String { 131 var imagedata = UIImagePNGRepresentation(image) 132 133 // Resize the image if it exceeds the 2MB API limit 134 if (imagedata?.count > 2097152) { 135 let oldSize: CGSize = image.size 136 let newSize: CGSize = CGSize(width: 800, height: oldSize.height / oldSize.width * 800) 137 imagedata = resizeImage(newSize, image: image) 138 } 139 140 return imagedata!.base64EncodedString(options: .endLineWithCarriageReturn) 141 } 142 143 func createRequest(with imageBase64: String) { 144 // Create our request URL 145 146 var request = URLRequest(url: googleURL) 147 request.httpMethod = "POST" 148 request.addValue("application/json", forHTTPHeaderField: "Content-Type") 149 request.addValue(Bundle.main.bundleIdentifier ?? "", forHTTPHeaderField: "X-Ios-Bundle-Identifier") 150 151 // Build our API request 152 let jsonRequest = [ 153 "requests": [ 154 "image": [ 155 "content": imageBase64 156 ], 157 "features": [ 158 [ 159 "type": "TEXT_DETECTION", 160 "maxResults": 1 161 ], 162 ] 163 ] 164 ] 165 let jsonObject = JSON(jsonDictionary: jsonRequest) 166 167 // Serialize the JSON 168 guard let data = try? jsonObject.rawData() else { 169 return 170 } 171 172 request.httpBody = data 173 174 // Run the request on a background thread 175 DispatchQueue.global().async { self.runRequestOnBackgroundThread(request) } 176 } 177 178 func runRequestOnBackgroundThread(_ request: URLRequest) { 179 // run the request 180 181 let task: URLSessionDataTask = session.dataTask(with: request) { (data, response, error) in 182 guard let data = data, error == nil else { 183 print(error?.localizedDescription ?? "") 184 return 185 } 186 187 self.analyzeResults(data) 188 } 189 190 task.resume() 191 } 192} 193 194 195// FIXME: comparison operators with optionals were removed from the Swift Standard Libary. 196// Consider refactoring the code to use the non-optional operators. 197fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool { 198 switch (lhs, rhs) { 199 case let (l?, r?): 200 return l < r 201 case (nil, _?): 202 return true 203 default: 204 return false 205 } 206} 207 208// FIXME: comparison operators with optionals were removed from the Swift Standard Libary. 209// Consider refactoring the code to use the non-optional operators. 210fileprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool { 211 switch (lhs, rhs) { 212 case let (l?, r?): 213 return l > r 214 default: 215 return rhs < lhs 216 } 217}

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問