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

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

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

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Swift

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

Q&A

0回答

745閲覧

Swift ARkitで 画像認識したら画像をハイライト表示し 画像の上に画像名を表示したい

SOU32

総合スコア12

ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Swift

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

0グッド

0クリップ

投稿2021/09/05 06:30

前提・実現したいこと

私はswift初心者でARを勉強しています。参考書『詳細 Swift iPhoneアプリ開発入門ノート:大重美幸 著』で勉強しています。 「画像認識で特定して画像名を表示」 したいのですが, うまくいきません。成功すれば Assets.xcassetsに登録している画像(例:ポカリスエットの写真を入れ 名前をPOCARI.jpegとして保存) をカメラで本物のポカリスエット缶を認識して、画像をハイライト表示し、その上に画像名(例:POCARI) が出てくるはずです。 実行させると successの表示が出ます。その上 sceneView.debugOptions = [.showFeaturePoints] の特徴点も出てきますが、肝心の画像のハイライトと画像名が出てきません。 参考書通りに 入力しているはずですが なぜでしょうか?
尚、この質問コーナーには画像を添付していないので これを解いて くださる方は 各自 画像(消しゴム、ぬいぐるみ、ペットジュース等)を挿入し、画像に名前をつけて やってみてください。

発生している問題・エラーメッセージ

一応 success の表示は出ています。気になるところとして  参考書には   
「画像名のテキストノードは 次のtextNodeクラスで作成します。 SCNTextクラスで文字のジオメトリーを作り、 SCNNodeクラスでノードを作成して子ノードとして selfに追加します。子ノードとして追加する理由は 文字列の位置が決めやすいからです」

と書いてありましたので cocoatouch でサブクラスを TextNodeとして書きました。 「  SCNTextクラスで文字のジオメトリーを作り、 SCNNodeクラスでノードを作成して子ノードとして selfに追加します。」 の表現の意味がいまいち 理解していないのですが cocoaTouchで 行うとは参考書には、書いてないのですが他に方法を知らないので それでやっています。

該当のソースコード

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

@IBOutlet var sceneView: ARSCNView! override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView.scene = SCNScene() //特徴点を表示する //デバックオプションで showFeaturePointを指定すると //検知した 特徴点を表示します。特徴点は自然に消えます。 sceneView.debugOptions = [.showFeaturePoints] } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //セッション止める sceneView.session.pause() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // ●Create a session configuration //ARWorldTrackingCOnfiguration()に //値を設定することでsceneViewに //平面検出を行うことを知らせています。 // コンフィグを作る let configuration = ARWorldTrackingConfiguration() //参照画像が用意できたなら セッション開始時のトラッキング // フィグのdetectionImagesプリパティに referenceImages // として指定します。referenceImagesは ARReferenceImage. // referenceImageで作ります。 // Assets.xcassetsの "AR Resources"グループの画像を参照する //認識する画像の参照イメージを取り込む guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { return } //参照画像を設定する configuration.detectionImages = referenceImages // ●Run the view's session //セッションを開始する //ARKitは特徴点を検出してARを表示、そしてカメラに //画像を表示するまでをセッションとして管理していて、 //sceneView.session.runからそれが窺えます sceneView.session.run(configuration) } // MARK: - ARSCNViewDelegate //画像認識したら下記が呼ばれる func renderer(_renderer:SCNSceneRenderer,didAdd node: SCNNode,for anchor:ARAnchor){ //次の3行で 画像認識したアンカーを取り出す guard let imageAnchor = anchor as? ARImageAnchor else { return } let referenceImage = imageAnchor.referenceImage //認識画像をハイライトする //認識した画像の縦横サイズをreferenceImage.physicalSize //から取得して SCNPlaneクラスのノードを被せてハイライト //表示します。ノードを90度回転させる方法として //ここでは eulerAngles(オイラー角)プロパティを利用しています。 let plane = SCNPlane(width: referenceImage.physicalSize.width, height: referenceImage.physicalSize.height) let planeNode = SCNNode(geometry:plane) //90度回転 planeNode.eulerAngles.x = -.pi/2 //半透明 planeNode.opacity = 0.5 //認識した画像の範囲に被せます node.addChildNode(planeNode) //認識した画像の名前を表示する //認識した画像名は referenceImage.name で取得できます。 //これを使って後述するTextNodeクラスでテキストノードを作って //画像の上に表示します。画像とテキストノードの向きが同じに //なるようにテキストノードも90度回転させています。 //ネームを表示する //参照画像の名前 let name = referenceImage.name! let nameNode = TextNode(str:name) //90度回転 nameNode.eulerAngles.x = -.pi/2 // 名前を表示します node.addChildNode(nameNode) }

}

この下の文は、cocoa Toch class で 別枠でTextNodeクラスを作っております

import SceneKit
import ARKit

//SCNNodeを継承して作ります

class TextNode: SCNNode {

required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(str:String){ super.init() //以下の3行で文字の ジオメトリを作る let text = SCNText(string: str,extrusionDepth: 0.01) text.font = UIFont(name: "Futura-Bold",size: 3) text.firstMaterial?.diffuse.contents = UIColor.red//塗り //テキストノードを作る let textNode = SCNNode(geometry: text)//ノードを作る self.addChildNode(textNode)//子ノードとして追加 //ここから3行はboundingBoxから幅と高さを求めます //ノードを囲む 領域 let (max,min) = textNode.boundingBox let w = abs(CGFloat(max.x - min.x)) let h = abs(CGFloat(max.y - min.y)) // 位置決め textNode.position = SCNVector3(-w/2, -h*1.2, 0) //全体を縮小する self.scale = SCNVector3(0.04, 0.04, 0.04) }

}

試したこと

参考書の見直し、google検索、そしてclass TextNode: SCNNode {以下の文を そのまま 上からの文章にくっつけて 1つの画面内にまとめたりしましたが、画像名表示はできませんでした。

補足情報(FW/ツールのバージョンなど)

swift5 Xcode PCは MacPro Book BigSurで作っています。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問