Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;范围未知的整数出现计数_C++_Opencv_Int - Fatal编程技术网

C++ C++;范围未知的整数出现计数

C++ C++;范围未知的整数出现计数,c++,opencv,int,C++,Opencv,Int,这将是漫长的,所以我提前道歉。但我想确保上下文被理解,因为我已经读了很多关于这个主题的帖子。我发现没有一个能解决根据未知数字范围计算数字的问题 我试图确定集合中每个整数的总出现次数。我遇到的问题是,测试集是固定的,比如说一个由10个数字组成的数组,但是每个数字的范围是未知的。提出的问题是,当试图使用数组统计总数时,数组范围在运行时不能是可变的。我使用vector ArrayName重试了此尝试,但我可以在运行时重新调整总计数组的大小,但在计算中使用vector值时出错 我将要介绍的代码是使用Op

这将是漫长的,所以我提前道歉。但我想确保上下文被理解,因为我已经读了很多关于这个主题的帖子。我发现没有一个能解决根据未知数字范围计算数字的问题

我试图确定集合中每个整数的总出现次数。我遇到的问题是,测试集是固定的,比如说一个由10个数字组成的数组,但是每个数字的范围是未知的。提出的问题是,当试图使用数组统计总数时,数组范围在运行时不能是可变的。我使用
vector ArrayName
重试了此尝试,但我可以在运行时重新调整总计数组的大小,但在计算中使用
vector
值时出错

我将要介绍的代码是使用
OpenCV
进行人脸检测。我研究并使用了各种样本中的代码来创建一个基本的检测程序,然后研究并移植了一些Java代码来处理人脸移动和更新到新位置时的跟踪。所有这些代码都在工作

我想使用所请求的信息,我想存储最后一个数组,比如说“代码>10”/代码>,检测到一个人脸的主题并找到一个随时间而被检测到的对象,并将其视为主题。比如说,我们检测到10帧,最后10帧的检测结果如下(-1是未知人脸):

-1,-1,0,0,0,3,0,-1,0,2
。在清点后,
0
发生频率最高,因此受试者为
0
。该范围未知的原因是,受试者ID取决于训练的受试者数量,并且总是在变化

这三个错误是(用//ERROR表示):

成员的使用无效(您是否忘记了“&”?),
对“(std::vector)(int)”的调用不匹配,
对“(std::vector)(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;
        }
    }
struct FaceStruct{
私人:
static const int NewLife=120;//除以FPS表示时间长度
静态常量int TotalTrackedSubjects=10;
智力生活;
病媒科目;
公众:
void Init(Rect,int);
无效主题(int);
int Subject();
直肠定位;
布尔使用;
虚空减弱();
无效更新();
bool Dead();
};
void FaceStruct::Init(Rect位置,int subject=-1){
位置=位置;
主题。调整大小(TotalTrackedSubjects-1);
对于(int i=0;TotalTrackedSubjects-1;i++){
受试者(i)=-1;//错误
}
更新();
}
void FaceStruct::addSubject(int subject){
对于(int i=0;TotalTrackedSubjects-2;i++){
主题(i)=主题(i+1);//错误
}
主题(TotalTrackedSubjects-1)=主题;//错误
}
int FaceStruct::Subject(){
int count_range=-1;
对于(int i=0;TotalTrackedSubjects-1;i++){
如果(受试者(i)>计数范围)计数范围=受试者(i);//错误
}
如果(计数范围<0){//受试者未知
返回-1;
}否则,如果(count_range==0){//Subject为0,则处理0的
整数总计=0;
对于(int i=0;TotalTrackedSubjects-1;i++){
如果(受试者(i)==0)总计+++;//错误
}
返回总数;
}else{//使用计数\范围
矢量总数;
int未知数=0;
总计。调整大小(计数范围);
对于(int i=0;TotalTrackedSubjects-1;i++){
如果(受试者(i)<0){//错误
未知数++;
}否则{
总计(受试者(i))=总计(受试者(i))+1;//错误
}
}
int最大=-1;
对于(int i=0;totals.size()-1;i++){
如果(总计(i)>最大值)最大值=总计(i);//错误
}
回报最大;
}
}
void FaceStruct::弱化(){
生命--;
}
void FaceStruct::续订(){
生活=新生活;
}
bool FaceStruct::Dead(){
如果(寿命<1){
返回true;
}否则{
返回false;
}
}

要访问数组中的项,应使用[]而不是()

所以
Subjects(i)
应该是
Subjects[i]

总计(受试者(i))=总计(受试者(i))+1

应该是
totals[Subjects[i]]=totals[Subjects[i]]+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;

(它们可能不是按那个顺序排列的。我觉得它们会,但我完全忘记了地图是如何排列它们的内容的。)

代码有几个问题:

    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;
        }
    }
1) 向量的数组访问使用数组下标运算符[]而不是函数运算符()

2) 方法和成员的命名使用不一致的样式,成员和方法应仅基于名称区分。让一个成员和方法只差一个容易漏掉的“s”是自找麻烦


3)考虑使用一个MAP或优先级队列代替一个向量,它应该去除很多非算法细节。

< P>你的循环条件看起来是错误的。
for( int i = 0; TotalTrackedSubjects - 1; i++ ) {
这相当于写:

int i = 0;
while(9){
  ...
  i++
}
for循环构造的第二部分是退出条件

我认为:

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

否则,您的循环将永远不会停止。

我想您在继续之前应该先阅读。for循环何时停止?我以前从未遇到过问题。TotalTrackedSubjects在结构顶部定义为const int 10,在那里它将在10-1结束…不?如果您认为它是这样的,那么从0到9不算。您是co对不起,我漏掉了“你是完全正确的”,我写道
for( int i = 0; i < TotalTrackedSubjects; i++ ) {