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

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

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

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

1回答

872閲覧

ARKIT前面カメラから取得したCVPixelBuffeをMat形式にする

chestnutforest

総合スコア9

ARKit

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

1クリップ

投稿2020/05/12 08:05

編集2022/01/12 10:55

###今取り組んでるプロジェクト
今、ARKitの前面カメラでARマーカーを検出し、ローカリゼーションするというプロジェクトに取り組んでます。
ARマーカー検出にはOPENCVのARUCOを使う予定です。しかしマーカー検出を行う関数

Swift

1cv::aruco::detectMarkers(mat,dictionary,corners,ids);

で問題が起きてます。

###質問
iphone前面カメラ(ARWorldTrackingConfiguration)でCVPixelBufferを取得してMatに変換した場合はまともなMatが得られるのですが、前面カメラ(ARFaceTrackingConfiguration)で取得したCVPixelBufferをMat形式に変換すると訳のわからない結果が得られます。これは何由来の問題でしょうか。また、どのようにすれば解決できますか。よろしくお願いします。

###追加
CVPixelBufferはYUV表色系を使っていて、それに関しては両面のカメラで共通です。
なので、前面か背面で同じ処理をして以下のような結果になるのは何かおかしいと思うのですが.....
以下の写真はCVPixelBufferの0チャンネルにアクセスして、一度Mat形式にしてテスト用にUIImageにして表示してます。

内容を見たところ、以下のリンクと同じような問題のようですが、提示された解決案では解決しませんでした。
iOS13.0から発生した問題らしくて、YUV形式のY成分の並びが順番通りではない事に由来するそうです。
https://stackoverflow.com/questions/58171534/why-is-yp-cb-cr-image-buffer-all-shuffled-in-ios-13

Swift

1 let pixelBuffer = frame.capturedImage 2 3 CVPixelBufferLockBaseAddress(pixelBuffer, 0); 4 void *baseaddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 5 CGFloat width = CVPixelBufferGetWidth(pixelBuffer); 6 CGFloat height = CVPixelBufferGetHeight(pixelBuffer); 7 cv::Mat mat(height, width, CV_8UC1, baseaddress, 0); 8

比較画像。画質については問題にしなくても大丈夫です

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

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

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

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

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

guest

回答1

0

確かこちらのカメラのデータには深度情報も含むものだったような。
なのでMatのチャネル数と異なるため結果のようになったのでは?

投稿2020/05/12 08:18

MasahikoHirata

総合スコア3747

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

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

chestnutforest

2020/05/12 08:24

今使用しているiPhone11proには両面ともデプスセンサ―がついています 背面カメラを使用しているときのみ、デプスセンサは作動していて、前面カメラではデプスセンサは稼働してない、なのでチャンネル数が異なってくるということでしょうか。よろしくおねがいします。 ちなみに 背面はrelative depths camera(どの点の前後関係のみわかる),前面はtrue depths camera(すべての点に対するm単位での正確な距離が計測できる)です。
chestnutforest

2020/05/13 06:12 編集

こちらのデータはYUV formatでYチャンネルとUVチャンネルの2チャンネルでした。今回はそのYチャンネルのみを取り出す作業になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問