0

特定のフレーム内のすべてのバウンディング ボックスの領域を格納するベクトルを宣言しました。次に、このベクトルを最初から最後まで繰り返し使用して、値を取得しました。次に、これらの値を昇順で並べ替えました (最低 -> 最高)。

私が使用するコードは次のとおりです。

 double area = contourArea(boundingBoxArea);
    list_area.push_back(area);
    sort(list_area.begin(), list_area.end());
    vector<double>::const_iterator area_iter;

    int i = 0;
    for(area_iter = list_area.begin(); area_iter != list_area.end(); area_iter++)
    {
        i++;
        cout<<"Iterator " <<i<< " size is : " <<*area_iter<<endl;
    }

私の問題は、一連の数値のうち最後の 2 つの値 (2 つの最大値) にのみ関心があることですが、目標を達成するためにどうすればよいかについては、本当に頭を悩ませることができません。

ここにいる誰かが私の問題に対する提案または解決策を持っています...?

よろしく

4

3 に答える 3

1

必要なのはstd::nth_elementです

    double area = contourArea(boundingBoxArea);
    list_area.push_back(area);
    std::nth_element(list_area.begin(), list_area.begin() + 2, list_area.end(), std::greater<double>());
    // first 2 elements in list_area are now 2 greatest
    vector<double>::const_iterator area_iter;

    int i = 0;
    for(area_iter = list_area.begin(); area_iter != list_area.end(); area_iter++)
    {
        i++;
        cout<<"Iterator " <<i<< " size is : " <<*area_iter<<endl;
    }
于 2013-02-23T02:56:46.967 に答える
1

リストを反復処理し、毎回新しい値を古い最大値と比較します。新しい値がより高い場合は、それを最高値として保存し、以前の最高値を保持する 2 番目の変数を持ちます。

このようなもの..構文的に正しくないかもしれませんが、ここにあります:-

   int iCurrentHighest = 0;
    int previousHighest = 0;
    for(area_iter = list_area.begin(); area_iter != list_area.end(); area_iter++)
        {
            if(*area_iter>iCurrentHighest)
            {
              previousHighest  = iCurrentHighest;
              iCurrentHighest = *area_iter;

            }
        else
            {
            if ((*area_iter<iCurrentHighest) && (*area_iter>previousHighest))
                {
                  previousHighest = *area_iter;
                }  
            }

        }
于 2013-02-23T02:50:16.327 に答える
1

これは、上記の @Rich によって提供されたアルゴリズムの異なるバージョンであり、比較がわずかに少なくなっています (各値を最大のものと 2 番目に大きいものでテストする代わりに、順序を逆にすることで比較の期待数を減らすことができます: 数値が小さい場合2 番目に大きいものよりも 1 回だけ比較されます)。

int first = 0;
int second = 0;
for (auto const & v : list) {
   if (v > second) {
      second = v;
      if (second > first)
         std::swap(first,second);
   }
}

他のすべてよりも小さい既知の値がない場合、firstおよびsecondの値は、ベクトルの最初の 2 つの値で (順番に) 初期化できます。

于 2013-02-23T04:03:39.703 に答える