2011-07-14 18 views
1

SURFを使用して類似の画像を検出するプロセスがあり、どの画像が実際のカメラの写真であり、どの画像がマップスクリーンショットのロゴなどのベクトル画像であるかを確認するチェックを追加したい。C++でOpenCVを使用してクリップアートやベクトル画像を検出する

写真:http://images.gta-travel.com/HH/Images/J/TYO/TYO-NEW3-8.jpg

ロゴ:http://estaticos.transhotel.com/img/fotos/hoteles/000137/hft000137578_005.jpg

ロゴ:http://live.viajesurbis.com/vuweb/content/fichashotel/13127/HOTEL_13127_2.jpg

私は灰色のヒストグラム(及びカラーヒストグラム)を見てみましたが、何も、十分な私を与えませんどの情報がベクトルであるかを知るための情報。

答えて

1

OK、次のコードはヒストグラムを消去し、すべての色をグレースケールで取得し、さまざまな色を数えます。おそらく将来、コンポーネントのヒストグラムを扱ってアルゴリズムを改善するかどうかをテストします。

CvHistogram* wImage::getHistogram() { 
    IplImage* gray = cvCreateImage(cvGetSize(this->image), 8, 1); 

    CvHistogram* hist; 
    int hist_size = 256; 
    float range[] = {0, 256}; 
    float* ranges[] = {range}; 

    cvCvtColor(this->image, gray, CV_RGB2GRAY); 
    hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1); 
    cvCalcHist(&gray, hist, 0, NULL); 

    return hist; 
} 

bool wImage::isVectorial() { 

    CvHistogram* hist = this->getHistogram(); 

    int height = 240; 

    float max_value = 0, min_value = 0; 
    cvGetMinMaxHistValue(hist, &min_value, &max_value); 

    int total = 0; 
    int colors = 0; 

    float value; 
    int normalized; 

    for(int i=0; i < 256; i++){ 
     value = cvQueryHistValue_1D(hist, i); 
     normalized = cvRound(value * height/max_value); 

     if(normalized < 2 || normalized > 230) { 
      continue; 
     } 

     colors++; 
     total += normalized; 
    } 

    if((total < 500 && colors < 100) || (total < 1000 && colors < 85)) { 
     return true; 
    } 

    return false; 
} 
関連する問題