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

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

新規登録して質問してみよう
ただいま回答率
85.50%
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

Q&A

解決済

1回答

1149閲覧

CoreMLの結果をtableviewに表示する

gomasan

総合スコア96

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

0グッド

0クリップ

投稿2019/09/07 05:25

CoreMLを使って画像認識を行いたいのですが、結果をLabelやtextfieldではなく、tableviewのcellに置きたいと思っています。

環境

xcode:10
swift:5

画像認識の結果をLabelに表示するコード

cameraViewcontroller

1import UIKit 2import CoreML 3import Vision 4 5class cameraViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 6 7 8 @IBOutlet weak var subLabel: UITextView! 9 10 @IBOutlet weak var PhotoView: UIImageView! 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // Do any additional setup after loading the view. 15 } 16 17 @IBAction func cameraView(_ sender: Any) { 18 19 let sourceType:UIImagePickerController.SourceType = 20 UIImagePickerController.SourceType.camera 21 // カメラが利用可能かチェック 22 if UIImagePickerController.isSourceTypeAvailable( 23 UIImagePickerController.SourceType.camera){ 24 // インスタンスの作成 25 let cameraPicker = UIImagePickerController() 26 cameraPicker.sourceType = sourceType 27 cameraPicker.delegate = self 28 self.present(cameraPicker, animated: true, completion: nil) 29 30 } 31 else{ 32 subLabel.text = "error" 33 34 } 35 } 36 37 // 撮影が完了時した時に呼ばれる 38 func imagePickerController(_ imagePicker: UIImagePickerController, 39 didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ 40 41 // dismiss 42 imagePicker.dismiss(animated: true, completion: nil) 43 44 if let pickedImage = info[.originalImage] 45 as? UIImage { 46 47 PhotoView.contentMode = .scaleAspectFit 48 PhotoView.image = pickedImage 49 50 photoPredict(pickedImage) 51 } 52 53 } 54 55 func photoPredict(_ targetPhoto: UIImage){ 56 57 // 学習モデルのインスタンス生成 58 guard let model = try? VNCoreMLModel(for: Resnet50().model) else{ 59 print("error model") 60 return 61 } 62 63 // リクエスト 64 let request = VNCoreMLRequest(model: model){ 65 request, error in 66 guard let results = request.results as? [VNClassificationObservation] else { 67 return 68 } 69 // 確率を整数にする 70 let conf = Int(results[0].confidence * 100) 71 // 候補の1番目 72 let name = results[0].identifier 73 74 if conf >= 50{ 75 self.subLabel.text = "(name) です。確率は(conf)% \n" 76 } 77 else{ 78 self.subLabel.text = "もしかしたら、(name) かも。確率は(conf)% \n" 79 } 80 } 81 // 画像のリサイズ 82 request.imageCropAndScaleOption = .centerCrop 83 84 // CIImageに変換 85 guard let ciImage = CIImage(image: targetPhoto) else { 86 return 87 } 88 89 // 画像の向き 90 let orientation = CGImagePropertyOrientation( 91 rawValue: UInt32(targetPhoto.imageOrientation.rawValue))! 92 93 // ハンドラを実行 94 let handler = VNImageRequestHandler( 95 ciImage: ciImage, orientation: orientation) 96 97 do{ 98 try handler.perform([request]) 99 100 }catch { 101 print("error handler") 102 } 103 104 } 105 106 107// //閉じる処理 108// imagePicker.dismiss(animated: true, completion: nil) 109// subLabel.text = "Tap the [Save] to save a picture" 110// 111// } 112 113 // 撮影がキャンセルされた時に呼ばれる 114 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 115 picker.dismiss(animated: true, completion: nil) 116// subLabel.text = "Canceled" 117 } 118 119 120 @IBAction func showAlbum(_ sender: Any) { 121 let sourceType:UIImagePickerController.SourceType = 122 UIImagePickerController.SourceType.photoLibrary 123 124 if UIImagePickerController.isSourceTypeAvailable( 125 UIImagePickerController.SourceType.photoLibrary){ 126 // インスタンスの作成 127 let cameraPicker = UIImagePickerController() 128 cameraPicker.sourceType = sourceType 129 cameraPicker.delegate = self 130 self.present(cameraPicker, animated: true, completion: nil) 131 132 subLabel.text = "Tap the [Start] to save a picture" 133 } 134 else{ 135 subLabel.text = "error" 136 137 } 138 } 139 140 141 @IBAction func nextButton(_ sender: Any) { 142 //button押したら次のページに遷移する。値も一緒に 143 let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "AI") as! AIViewController 144 145 //AIViewControllerのtextにsubLabelのテキストを代入 146 vc2.text = subLabel.text! 147 148 149 //NavigationControllerを継承したViewControllerを遷移 150 self.navigationController?.pushViewController(vc2, animated: true) 151 152 } 153 154 155}

改善したい箇所

cameraViewcontroller

1// リクエスト 2 let request = VNCoreMLRequest(model: model){ 3 request, error in 4 guard let results = request.results as? [VNClassificationObservation] else { 5 return 6 } 7 // 確率を整数にする 8 let conf = Int(results[0].confidence * 100) 9 // 候補の1番目 10 let name = results[0].identifier 11 12 if conf >= 50{ 13 self.subLabel.text = "(name) です。確率は(conf)% \n" 14 } 15 else{ 16 self.subLabel.text = "もしかしたら、(name) かも。確率は(conf)% \n" 17 } 18 }

上記のself.subLabel.textをsubLabelではなく新たに設置するTableviewのcell内です。

ご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

結果をStringの配列とかにしてTableViewに表示すればいいのではないでしょうか?
動作確認していないので簡単に書いてみます。

Swift

1class cameraViewController: UIViewController { 2 3 // TableViewを配置してOutlet接続してください 4 @IBOutlet weak var tableView: UITableView! 5 6 // TableViewに表示する結果の配列 7 private var dataSource: [String] = [String]() 8 9 // dataSourceとかセルの設定は省略します 10 11 func photoPredict(_ targetPhoto: UIImage){ 12 13 // 学習モデルのインスタンス生成 14 guard let model = try? VNCoreMLModel(for: Resnet50().model) else{ 15 print("error model") 16 return 17 } 18 19 // リクエスト 20 let request = VNCoreMLRequest(model: model){ 21 request, error in 22 guard let results = request.results as? [VNClassificationObservation] else { 23 return 24 } 25 // 確率を整数にする 26 let conf = Int(results[0].confidence * 100) 27 // 候補の1番目 28 let name = results[0].identifier 29 30 if conf >= 50{ 31 //self.subLabel.text = "(name) です。確率は(conf)% \n" 32 self.dataSource.append("(name) です。確率は(conf)% \n") 33 } 34 else{ 35 //self.subLabel.text = "もしかしたら、(name) かも。確率は(conf)% \n" 36 self.dataSource.append("もしかしたら、(name) かも。確率は(conf)% \n") 37 } 38 // TableViewをリロード 39 self.tableView.reloadData() 40 } 41 // 画像のリサイズ 42 request.imageCropAndScaleOption = .centerCrop 43 44 // CIImageに変換 45 guard let ciImage = CIImage(image: targetPhoto) else { 46 return 47 } 48 49 // 画像の向き 50 let orientation = CGImagePropertyOrientation( 51 rawValue: UInt32(targetPhoto.imageOrientation.rawValue))! 52 53 // ハンドラを実行 54 let handler = VNImageRequestHandler( 55 ciImage: ciImage, orientation: orientation) 56 57 do{ 58 try handler.perform([request]) 59 60 }catch { 61 print("error handler") 62 } 63 64 } 65 66} 67 68extension: cameraViewController: UITableViewDataSource, UITableViewDelegate { 69 70 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 71 return dataSource.count 72 } 73 74 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 75 let cell = tableView.dequeueReusableCell(withIdentifier: /*reuseId*/, for: indexPath) 76 cell.textLabel?.text = dataSource[indexPath.row] 77 return cell 78 } 79}

投稿2019/09/10 05:11

hayabusabusash

総合スコア767

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問