テスト自動化作業用の画像フォーカスアルゴリズムを開発しようとしています。私は AForge.net を使用することにしました。.net に適した成熟したシステムのように思われるからです。
残念ながら、ゼロからオートフォーカス アルゴリズムを構築するための情報を見つけることができないようです。そのため、最善を尽くしました。
イメージを取る。グレースケール エッジ アウトラインを生成するソーベル エッジ検出フィルターを適用します。ヒストグラムを生成し、標準 dev を保存します。カメラを被写体に 1 歩近づけて、別の写真を撮ります。標準開発が以前のものよりも小さい場合、私たちはより焦点を当てています。そうでなければ、写真を撮るのに最適な距離を過ぎています。
より良い方法はありますか?
更新:ちなみに、これには大きな欠陥があります。最適な焦点を過ぎると、「焦点が合った画像」の値が増え続けます。距離/フォーカス値を見て放物線のような関数を期待するでしょうが、実際にはより対数的なものを取得します
更新 2: わかったので、これに戻り、調査している現在の方法には、いくつかの既知のエッジが与えられています (わかりました。写真のオブジェクトが何であるかを正確に知っています)。手動でピクセル強度を比較します。結果のグラフが急勾配になるにつれて、私はより焦点を当てます。コア アルゴリズムが matlab から c# に移植されたら、コードを投稿します (ええ、matlab .. :S)
更新 3: 最終更新です。再びこれに戻ってきました。最終的なコードは次のようになります。
ステップ1:画像のリストから画像を取得します(焦点を合わせて100枚の写真を撮りました)
ステップ 2: フォーカスしているオブジェクトのエッジを見つけます (私の場合、常に同じ場所にある長方形のオブジェクトなので、1 つのエッジの HIGH と NARROW の長方形をトリミングします)
ステップ 3: トリミングされた画像の HorizontalIntensityStatistics (Aforge.net クラス) を取得します。
ステップ4:ヒストグラムを取得します(私の場合はグレー)
ステップ 5: ヒストグラムの値の導関数を見つける
ステップ 6: 傾斜が最大のときは、最も焦点が合っているときです。