C++ 使用cv::ml::StatModel::train以使用KNN时出现Opencv错误
问题1: 我试图用Visual Studio 2017和C++实现OpenCV 3.4中的KNN。到目前为止,我已经能够解决我的问题,但昨天我遇到了以下错误: “非静态成员引用必须相对于特定对象”C++ 使用cv::ml::StatModel::train以使用KNN时出现Opencv错误,c++,opencv,computer-vision,knn,C++,Opencv,Computer Vision,Knn,问题1: 我试图用Visual Studio 2017和C++实现OpenCV 3.4中的KNN。到目前为止,我已经能够解决我的问题,但昨天我遇到了以下错误: “非静态成员引用必须相对于特定对象” int main(int argc,const char*argv[]{ ReadData(“smokeDataBase.yml”,0);//14烟雾 ReadData(“forestDataBase.yml”,1);//14森林 ReadData(“skyDataBase.yml”,2);//12天
int main(int argc,const char*argv[]{
ReadData(“smokeDataBase.yml”,0);//14烟雾
ReadData(“forestDataBase.yml”,1);//14森林
ReadData(“skyDataBase.yml”,2);//12天空
ReadData(“testDataBase.yml”,3);
Mat trainClasses=(Mat_u40;40,1)这是你的第一个问题:
这是功能序列的签名,如中所述
正如您所看到的,该方法是虚拟的,这意味着您不能以这种方式调用它!。该函数应该由StatModel的子类实现。因此,当您想要使用该方法时,可以从实现该方法的子类调用该方法。类KNearest实现了该方法。您的代码应该更改为:
Ptr<ml::KNearest> knn = ml::KNearest::create();
knn->train(trainData, ml::ROW_SAMPLE , trainClasses);
Ptr knn=ml::KNearest::create();
knn->列车(列车数据,ml::行样本,列车类别);
现在回答第二个问题:
您可以将数据准备为行样本或列样本。
在ROW_SAMPLE中,每个示例都在一行中。因此,如果您的示例由三个浮点数组成,并且您有10个示例,那么您应该得到一个具有10行3列的Mat对象。
在COL_示例中,所有内容都是颠倒的。因此,您将得到3行10列。这非常有效。这是我第一次遇到虚拟方法。非常感谢您的快速响应。@CarlosHernandezPerez如果这对您有帮助,您应该接受它。
virtual bool cv::ml::StatModel::train ( InputArray samples,
int layout,
InputArray responses
)
Ptr<ml::KNearest> knn = ml::KNearest::create();
knn->train(trainData, ml::ROW_SAMPLE , trainClasses);