1

問題をさらに調査するために、このトピックに関する最後の質問を削除しました。

私は、iPhone のローカル フォト アルバムにインデックスを付けるコンテンツ ベースの画像検索データベースに取り組んでいます。特徴抽出のためのフィルターとメソッドを作成しましたが、前処理ステップとして、CIDetector を使用して顔の四角形を検出し、それらの四角形をローカル バイナリ パターン フィルターでフィルター処理して、小さな四角形のヒストグラムを抽出します。

大きなフォト アルバムのインデックス作成には明らかにかなりの時間がかかるため、フィルターを実行して特徴を抽出するバックグラウンド スレッドを使用して非同期になるように設計しました。

これに関する問題は、フォト アルバムの画像にアクセスする唯一の方法が PHAsset 経由であるように思われることです。一般的に使用される 2 つの API があり、どちらもコールバック ブロックを必要とします。そのうちの 1 つは UIImage 表現を取得します。主に、それらの多くをロードする必要があり、メモリの制約が厳しく、画像を表示するつもりがないため、これは私が望むものではありません。オブジェクトのディクショナリも返します。そのうちの 1 つは画像ファイル自体の URL ですが、使用+[CIImage imageWithContentsOfURL]すると nil が返され、iOS コンソールは、この API を使用すると画像へのアクセス許可が拒否されたことを示します。

もう一つは-[PHAsset requestContentEditingInputWithOptions]. この特定の API は、API を呼び出したキューに関係なく、コールバック ブロックがメイン キューで強制的に呼び出されるようにします。コールバック ブロックは常にメイン キューにディスパッチされます。この API を使用すると、 を使用して CIImage を正常にロードでき+[CIImage imageWithContentsOfURL]ます。これは、API がファイルへのアクセス許可を効果的に与えたことを意味します。その後、すべてのインデックス処理ステップを実行する別のキューに CIImage を配置できます。

このアプローチは機能しているように見えますが、短期間だけです。最終的にアプリがクラッシュし、前の処理中に というメッセージが表示されるだけConnection to assetsd was interrupted or assetsd diedです。

操作を別のキューに入れず、API がコールバックを強制するメイン キューで実行すると、すべて問題なく、そのメッセージはコンソールに表示されません。しかし、これにより、メインスレッドは非常に高価な画像処理を行うために常にビジー状態になります。

編集:おそらくこのAPIを誤用していると思いますが、必要なデータを適切な形式(ファイルからピクセルデータをロードするために使用できるCIImage)で提供できるのはこれだけのようです処理中に必要)。

私が現在使用している API は、画像編集データが UI で使用され、それを管理しているサービスがアプリでセッションを開いたままにしておく、インタラクティブな画像フィルタリング セッションにより適していると思われます。

4

0 に答える 0