2

長くなりそうなので、先に失礼します。しかし、私はすでにこの件に関する多数の投稿を読んでいるので、文脈が理解されていることを確認したいと思います. 私が見つけたものは、未知の範囲の数値に基づいて数値を集計する問題を解決するものではありません。

セットの各整数の合計出現回数を決定しようとしています。私が抱えている問題は、テスト セットが固定されていることです。たとえば、10 個の数値の配列ですが、各数値の範囲は不明です。問題は、配列を使用して合計を集計しようとすると、実行時に配列範囲を可変にできないことです。を使用してこの試行を再試行しvector<int> ArrayNameましたが、実行時に合計の配列のサイズを変更できましたがvector<int>、計算で値を使用するとエラーが発生しました。

私が提示するコードはOpenCV、顔検出に使用されます。さまざまなサンプルのコードを調査して利用し、基本的な検出プログラムを作成しました。次に、Java コードを調査して移植し、顔が移動したときの追跡を処理して新しい場所に更新しました。このコードはすべて機能しています。

要求された情報を使用したいのは、最後に10検出された顔の被写体の配列を保存し、時間の経過とともに最も検出されたものを見つけて、それを被写体と見なしたいということです。10 を検出していて、最後の 10 フレームが次のように検出されたとします (-1 は未知の顔です) -1, -1, 0, 0, 0, 3, 0, -1, 0, 2。集計後、0最も頻繁に発生したため、主題は0です。範囲が不明な理由は、被験者 ID が訓練された被験者の数に依存し、常に変化しているためです。

3 つのエラーは次のとおりです ( //ERROR で示されます)。

invalid use of member (did you forget the '&' ?), 
no match for call to '(std::vector<int>) (int)', 
no match for call to '(std::vector<int>) (int)&'

コードは次のとおりです。

    struct FaceStruct {
    private:
        static const int NewLife = 120; //Divide by FPS for Length in Time
        static const int TotalTrackedSubjects = 10;
        int Life;
        vector<int> Subjects;
    public:
        void Init( Rect, int );
        void addSubject( int );
        int Subject();
        Rect Location;
        bool Used;
        void Weaken();
        void Renew();
        bool Dead();
    };
    void FaceStruct::Init( Rect location, int subject = -1 ) {
        Location = location;
        Subjects.resize( TotalTrackedSubjects - 1 );
        for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
            Subjects(i) = -1; //ERROR
        }
        Renew();
    }
    void FaceStruct::addSubject( int subject ) {
        for( int i = 0; TotalTrackedSubjects - 2; i++ ) {
            Subjects(i) = Subjects( i + 1 );  //ERROR
        }
        Subjects( TotalTrackedSubjects - 1 ) = subject;  //ERROR
    }
    int FaceStruct::Subject() {
        int count_range = -1;
        for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
            if( Subjects(i) > count_range ) count_range = Subjects(i); //ERROR
        }
        if( count_range < 0 ) { //Subject Unknown
            return -1;
        } else if( count_range == 0 ) { //Subject is 0, Handle 0's
            int totals = 0;
            for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
                if( Subjects(i) == 0 ) totals++; //ERROR
            }
            return totals;
        } else { //Use count_range
            vector<int> totals;
            int unknowns = 0;
            totals.resize( count_range );
            for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
                if( Subjects(i) < 0 ) { //ERROR
                    unknowns++;
                } else {
                    totals( Subjects(i) ) = totals( Subjects(i) ) + 1; //ERROR
                }
            }
            int largest = -1;
            for( int i = 0; totals.size() - 1; i++ ) {
                if( totals(i) > largest ) largest = totals(i); //ERROR
            }
            return largest;
        }
    }
    void FaceStruct::Weaken() {
        Life--;
    }
    void FaceStruct::Renew() {
        Life = NewLife;
    }
    bool FaceStruct::Dead() {
        if( Life < 1 ) {
            return true;
        } else {
            return false;
        }
    }
4

4 に答える 4

1

配列内の項目にアクセスするには、() の代わりに [] を使用する必要があります

そう Subjects(i)あるべきだ Subjects[i] し、そうある
totals( Subjects(i) ) = totals( Subjects(i) ) + 1; べきだ totals[ Subjects[i] ] = totals[ Subjects[i] ] + 1;

于 2012-10-10T20:48:46.243 に答える
1

マップはかなりうまく機能するように思えます...

#include <map>

int example_values[10] = {-1, -1, 0, 0, 0, 3, 0, -1, 0, 2};

map<int, int> counts;
for (int i = 0; i < 10; ++i) ++counts[example_values[i]];

for (map<int, int>::iterator i = counts.begin(); i != counts.end(); ++i)
    cout << i->first << ": " << i->second << endl;

出力:

-1: 3
0: 5
2: 1
3: 1

(それらはその順序ではないかもしれません。そうなる気がしますが、マップがコンテンツをどのように順序付けているかを正確に忘れています。)

于 2012-10-10T20:48:57.427 に答える
0

コードにはいくつかの問題があります。

1) ベクトルの配列アクセスでは、関数演算子 () ではなく、配列添え字演算子 [] を使用します。

2) メソッドとメンバーの命名は一貫性のないスタイルを使用します。メンバーとメソッドは名前のみに基づいて区別できる必要があります。見落としがちな 's' が 1 つだけ異なるメンバーとメソッドを使用すると、問題が発生します。

3) ベクトルの代わりにマップまたはプライオリティ キューを使用することを検討してください。これにより、多くの非アルゴリズムの詳細が削除されます。

于 2012-10-10T21:04:35.333 に答える
0

ループ条件が間違っているようです。

for( int i = 0; TotalTrackedSubjects - 1; i++ ) {

これは次のように書くことと同じです:

int i = 0;
while(9){
  ...
  i++
}

for ループ構造の 2 番目の部分は、終了条件です。

私はそれがあると思います:

for( int i = 0; i < TotalTrackedSubjects; i++ ) {

そうしないと、ループが停止することはありません。

于 2012-10-10T21:10:52.430 に答える