長くなりそうなので、先に失礼します。しかし、私はすでにこの件に関する多数の投稿を読んでいるので、文脈が理解されていることを確認したいと思います. 私が見つけたものは、未知の範囲の数値に基づいて数値を集計する問題を解決するものではありません。
セットの各整数の合計出現回数を決定しようとしています。私が抱えている問題は、テスト セットが固定されていることです。たとえば、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;
}
}