私はAndroid上のOpenCVのロゴ検出アプリケーションで働いています。私はたくさんの検索をしていて、この目的のためにほとんどの場合特徴検出が使われていることがわかりました。
そこで、さまざまな検出器とマッチャーを検索して試し、最後にORBFeatureDetectorとBruteForceマッチャーでうまく機能するコードを作成しました。
private DescriptorMatcher BruteMatcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
私はこのような一致の数と最小距離と良い一致の数を見つけました:
List<DMatch> matches = mat_of_matches.toList();
double max_dist =0, min_dist= 100;
int row_count = matches.size();
for(int i=0;i<row_count;i++)
{
double dist = matches.get(i).distance;
//System.out.println("dist="+dist);
if(dist<min_dist)min_dist = dist;
if(dist>max_dist)max_dist = dist;
}
// Log.e("Max_dist,Min_dist", "Max="+max_dist+", Min="+min_dist);
List<DMatch> good_matches = new ArrayList<DMatch>();
double good_dist = 3*min_dist;
for(int i =0;i<row_count; i++)
{
if(matches.get(i).distance<good_dist)
{
good_matches.add(matches.get(i));
//Log.e("good_matches", "good_match_id="+matches.get(i).trainIdx);
}
}
、そして最後に私はこのようなしきい値を作成しました:
if(row_count>490&&good_matches.size()<60&&min_dist<12)logo_detected=true;
else logo_detected=false;
問題は、アクセスされたしきい値にある他の多くのものについて、アプリケーションがロゴが検出されたと言い続けることです。
検出された一致する機能をどうすればよいですか?それは正しいことですか(しきい値処理)?または、ロゴを検出するために何か他のことをする必要がありますか?
助けてください、ありがとう。