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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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

解決済

1回答

2261閲覧

cvPixelBufferから生成したUIImageがnilになってしまう

chestnutforest

総合スコア9

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クリップ

投稿2020/04/07 06:06

###問題
CvPixelBufferをCIImage経由でUIImageにしたところ、UIImageViewには表示できるのに他の関数の引数に渡したらnilになってしまいます。

###この問題に到ったまで
下記のリンクでの質問について調査していくうちに本質的な問題は「cvPixelBufferから生成したUIImageがnilになってしまう」だと言うことに気付きました。

厳密にUIImageが生成された時からnilになっているのではなく、インスタンスは生成できていて、UIImageVireには表示できるのに、それ以外の用途で使おうとするとnilになります。
保存やcropなどです。最終的にはcropを目的としています。

https://teratail.com/questions/251832

###エラー文
当然ながら

swift

1Fatal error: Unexpectedly found nil while unwrapping an Optional value

###コード

swift

1self.videoImage = CIImage(cvPixelBuffer: videoPixelBuffer) 2let scale = 3.008 3let image = UIImage(ciImage: self.videoImage!, scale: CGFloat(scale), orientation: .up) 4let cropped = self.cropImage(image: image, cropRect: CGRect(x: 0, y: 0, width: 100, height: 100)) //Link参照 関数内部でnil

###追記
元々やりたいことは「カメラからの入力をcropしてUIImageとして取得する」ことだけなのにもう戦い始めて三日目です....(自分が全くの未熟者だからですが)お助けいただければ幸いです。

この問題に到ったまでの質問:https://teratail.com/questions/251832

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

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

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

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

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

TsukubaDepot

2020/04/07 06:57

ciImage - The underlying Core Image data. https://developer.apple.com/documentation/uikit/uiimage/1624129-ciimage 上記のリンクに If the UIImage object was initialized using a CGImage, the value of the property is nil. とありますが、これが原因ではありませんか。そうなると当然 let cropRef = image.cgImage!.cropping(to: cropRect) のcgImage は nil となるので必ず失敗します。
chestnutforest

2020/04/07 07:05 編集

つまるところ、 CIImage -> UIImage -> CGImage ->UIImageという変換ではダメということですね。(今見るとおもいっきり遠回りしてますね) 最後に、解答していただき誠にありがとうございます。 前問をクリップしてくださっている方々がいるので、そちらのほうを考慮して頑張って解決しようと思います。なにか案がありましたらご提示いただけると幸いです。 CIImage -> CGImage -> UIImageの変換でcropすればよいということになりますが、実はこれはすでに試していて別の問題に行きついた気がします....(忘れました、すみません)また一段落して方針が付きましたら改めて投稿させて頂きます。
chestnutforest

2020/04/07 07:05

回答していただき、誠にありがとうございます。
ch3cooh

2020/04/07 07:32 編集

CIImageに縁がなくて確実な回答を書くことができないのですが、 1. CGImageにアクセスしなくても良いように CIImage -> UIImageを生成して `UIImage#draw()` の方を利用する。 2. `CIImage#cropped` を利用する で解決しないでしょうか。2に関しては利用例が下記のリポジトリで公開されています。 * https://github.com/Coeur/ImageEffects/blob/master/SwiftImageEffects/ImageEffects%2Bextensions.swift ``` extension UIImage { open func cropped(to rect: CGRect) -> UIImage { // a UIImage is either initialized using a CGImage, a CIImage, or nothing if let cgImage = self.cgImage { // CGImage.cropping(to:) is magnitudes faster than UIImage.draw(at:) if let cgCroppedImage = cgImage.cropping(to: rect) { return UIImage(cgImage: cgCroppedImage) } else { return UIImage() } } if let ciImage = self.ciImage { // Core Image's coordinate system mismatch with UIKit, so rect needs to be mirrored. var ciRect = rect ciRect.origin.y = ciImage.extent.height - ciRect.origin.y - ciRect.height let ciCroppedImage = ciImage.cropped(to: ciRect) return UIImage(ciImage: ciCroppedImage) } return self } } ```
chestnutforest

2020/04/07 07:42

->ch3coohさん こちらのほうでも試して実際に動くか試してみます。 私の様々な質問にお答えくださり、誠にお世話になっております! 結果のほうは明日辺りにまとめさせていただきます。
chestnutforest

2020/04/09 06:29

->ch3coohさん こちらでも動きました!ありがとうございます!
guest

回答1

0

ベストアンサー

自分の古い記事ですが、以下のコードを使ってcropしてもらえればもしかしたら動くかもしれません。
https://qiita.com/takabosoft/items/391b7593f0b9ef7d77a5

※cgImageにアクセスしていますが、ちゃんとアンラップしているので落ちはしないはず(必ずopaque=falseになるのでメモリ喰うかもですが)

投稿2020/04/07 07:16

takabosoft

総合スコア8356

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

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

chestnutforest

2020/04/07 07:25

ご回答誠にありがとうございます。 私のコードにご提示いただいた記事のコードを当てはめたら動きました! 大変お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問