###今取り組んでるプロジェクト
今、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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/12 08:24
2020/05/13 06:12 編集