- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用特征包模型、训练和支持 vector 机。我正在使用 this教程和this示例代码。我正在使用 Windows 8 和 OpenCV 2.4.10。我在 Visual Studio 2012 上运行它。但我不断收到此错误“CvSVM::CvSVM”:无法访问类“CvSVM”中声明的私有(private)成员我尝试使用 OpenCV 2.4.9,但同样的错误仍然存在。
我为此搜索了很多,但仍然找不到合适的解决方案。请帮我解决这个问题。提前致谢。下面是代码。我也在为 Microsoft Visual Studio 使用这个 Dirent API。
编辑:这是编译时 visual studio 的完整输出。第 146 行给出了错误。
------ Build started: Project: ConsoleApplication1, Configuration: Debug x64 ------
1> main.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\utility(138): error C2248: 'CvSVM::CvSVM' : cannot access private member declared in class 'CvSVM'
1> D:\Program Files\opencv\build\include\opencv2/ml/ml.hpp(553) : see declaration of 'CvSVM::CvSVM'
1> D:\Program Files\opencv\build\include\opencv2/ml/ml.hpp(452) : see declaration of 'CvSVM'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\map(198) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<const std::basic_string<_Elem,_Traits,_Alloc>&,CvSVM>(_Other1,_Other2 &&,void **)' being compiled
1> with
1> [
1> _Ty1=std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
1> _Ty2=CvSVM,
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>,
1> _Other1=const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &,
1> _Other2=CvSVM
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\map(198) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<const std::basic_string<_Elem,_Traits,_Alloc>&,CvSVM>(_Other1,_Other2 &&,void **)' being compiled
1> with
1> [
1> _Ty1=std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
1> _Ty2=CvSVM,
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>,
1> _Other1=const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &,
1> _Other2=CvSVM
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\map(191) : while compiling class template member function 'CvSVM &std::map<_Kty,_Ty>::operator [](const std::basic_string<_Elem,_Traits,_Alloc> &)'
1> with
1> [
1> _Kty=std::string,
1> _Ty=CvSVM,
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> main.cpp(146) : see reference to function template instantiation 'CvSVM &std::map<_Kty,_Ty>::operator [](const std::basic_string<_Elem,_Traits,_Alloc> &)' being compiled
1> with
1> [
1> _Kty=std::string,
1> _Ty=CvSVM,
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> main.cpp(123) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
1> with
1> [
1> _Kty=std::string,
1> _Ty=CvSVM
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
#include <fstream>
#include <iostream>
#include <string>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <opencv2/nonfree/nonfree.hpp>
using namespace cv;
using namespace std;
int main (int argc, char * const argv[]) {
string dir = "C:\\Users\\Rajind\\Downloads\\FoodcamClassifier-master\\FoodcamClassifier-master\\foodcamimages\\TRAIN", filepath;
DIR *dp;
struct dirent *dirp;
struct stat filestat;
dp = opendir( dir.c_str() );
// detecting keypoints
SurfFeatureDetector detector(1000);
vector<KeyPoint> keypoints;
// computing descriptors
Ptr<DescriptorExtractor > extractor(new SurfDescriptorExtractor());// extractor;
Mat descriptors;
Mat training_descriptors(1,extractor->descriptorSize(),extractor->descriptorType());
Mat img;
cout << "------- build vocabulary ---------\n";
cout << "extract descriptors.."<<endl;
int count = 0;
while (count++ < 15 && (dirp = readdir( dp )))
{
filepath = dir + "/" + dirp->d_name;
// If the file is a directory (or is in some way invalid) we'll skip it
if (stat( filepath.c_str(), &filestat )) continue;
if (S_ISDIR( filestat.st_mode )) continue;
img = imread(filepath);
detector.detect(img, keypoints);
extractor->compute(img, keypoints, descriptors);
training_descriptors.push_back(descriptors);
cout << ".";
}
cout << endl;
closedir( dp );
cout << "Total descriptors: " << training_descriptors.rows << endl;
BOWKMeansTrainer bowtrainer(150); //num clusters
bowtrainer.add(training_descriptors);
cout << "cluster BOW features" << endl;
Mat vocabulary = bowtrainer.cluster();
Ptr<DescriptorMatcher > matcher(new BFMatcher(NORM_L2,false));
BOWImgDescriptorExtractor bowide(extractor,matcher);
bowide.setVocabulary(vocabulary);
//setup training data for classifiers
map<string,Mat> classes_training_data; classes_training_data.clear();
cout << "------- train SVMs ---------\n";
Mat response_hist;
cout << "look in train data"<<endl;
count = 0;
char buf[255];
ifstream ifs("training.txt");
int total_samples = 0;
do
{
ifs.getline(buf, 255);
string line(buf);
istringstream iss(line);
// cout << line << endl;
iss >> filepath;
Rect r; char delim;
iss >> r.x >> delim;
iss >> r.y >> delim;
iss >> r.width >> delim;
iss >> r.height;
// cout << r.x << "," << r.y << endl;
string class_;
iss >> class_;
img = imread(filepath);
r &= Rect(0,0,img.cols,img.rows);
if(r.width != 0) {
img = img(r); //crop to interesting region
}
char c__[] = {(char)atoi(class_.c_str()),'\0'};
string c_(c__);
cout << ".";
// putText(img, c_, Point(20,20), CV_FONT_HERSHEY_PLAIN, 2.0, Scalar(255), 2);
// imshow("pic",img);
bowide.compute(img, keypoints, response_hist);
if(classes_training_data.count(c_) == 0) { //not yet created...
classes_training_data[c_].create(0,response_hist.cols,response_hist.type());
}
classes_training_data[c_].push_back(response_hist);
total_samples++;
// waitKey(0);
} while (!ifs.eof());
cout << endl;
//train 1-vs-all SVMs
map<string,CvSVM> classes_classifiers;
for (map<string,Mat>::iterator it = classes_training_data.begin(); it != classes_training_data.end(); ++it) {
string class_ = (*it).first;
cout << "training class: " << class_ << ".." << endl;
Mat samples(0,response_hist.cols,response_hist.type());
Mat labels(0,1,CV_32FC1);
//copy class samples and label
samples.push_back(classes_training_data[class_]);
Mat class_label = Mat::ones(classes_training_data[class_].rows, 1, CV_32FC1);
labels.push_back(class_label);
//copy rest samples and label
for (map<string,Mat>::iterator it1 = classes_training_data.begin(); it1 != classes_training_data.end(); ++it1) {
string not_class_ = (*it1).first;
if(not_class_[0] == class_[0]) continue;
samples.push_back(classes_training_data[not_class_]);
class_label = Mat::zeros(classes_training_data[not_class_].rows, 1, CV_32FC1);
labels.push_back(class_label);
}
Mat samples_32f; samples.convertTo(samples_32f, CV_32F);
classes_classifiers[class_].train(samples_32f,labels);
}
cout << "------- test ---------\n";
//evaluate
dir = "/Users/royshilkrot/Downloads/foodcamimages/TEST";
dp = opendir( dir.c_str() );
count = 0;
while (count++ < 5 && (dirp = readdir( dp )))
{
filepath = dir + "/" + dirp->d_name;
// If the file is a directory (or is in some way invalid) we'll skip it
if (stat( filepath.c_str(), &filestat )) continue;
if (S_ISDIR( filestat.st_mode )) continue;
if (dirp->d_name[0] == '.') continue; //hidden file!
cout << "eval file " << filepath << endl;
img = imread(filepath);
bowide.compute(img, keypoints, response_hist);
//test vs. SVMs
for (map<string,CvSVM>::iterator it = classes_classifiers.begin(); it != classes_classifiers.end(); ++it) {
float res = (*it).second.predict(response_hist,false);
cout << "class: " << (*it).first << ", response: " << res << endl;
}
// cout << ".";
}
cout << endl;
closedir( dp );
cout <<"done"<<endl;
return 0;
}
最佳答案
报错是因为你不能访问CvSVM的拷贝构造函数和拷贝赋值运算符。这将需要复制没有公共(public)复制构造函数的 CvSVM 对象。
看看 CvSVM 的定义就知道了:
// SVM model
class CV_EXPORTS_W CvSVM : public CvStatModel
{
public:
...
private:
CvSVM(const CvSVM&);
CvSVM& operator = (const CvSVM&);
};
如果您坚持使用 CvSVM 容器,您应该尝试使用指针:
std::map<std::string, std::unique_ptr<CvSVM>>
关于c++ - 错误 C2248 : 'CvSVM::CvSVM' : cannot access private member declared in class 'CvSVM' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28163647/
我有一个模板类 展览.h: template class ExpOf{ ... } 我在整个代码中反复使用,例如T = double [和其他类ExpOf应该一无所知]。 所以我认为一次性编译它是个
如果你有一个名为“Rock”的类,你会做类似的事情:- int main() { Rock; } 为什么会出现“声明未声明任何内容”错误? 它不应该只是调用默认构造函数并在那一刻创建对象吗?
这是一个非常业余的问题,我确信这将是一个非常简单的答案,但我似乎无法弄清楚问题所在。我有一个带有相应 .cpp 文件的头文件,但出于某种原因,每当我尝试使用 g++ 进行编译时,我都会收到错误消息:
我正在使用 MinGW 将我的 Linux 项目转换为在 Windows 上编译。它在 Linux 上编译和运行都很好,但是当我尝试用 MinGW 编译它时,它会出现以下错误消息: camera.h:
我收到“decleration does not declare anything [-fpermissive] 错误”;这是我的代码; #ifndef CAMERA_H #define CAMERA
我正在编写一些 cython 代码,但遇到了一个奇怪的问题。当我尝试将对象作为结构直接从 python 传递到 C 时,cython 生成的代码很好,但 gcc 不喜欢代码输出并给我以下错误:erro
typedef struct BO2Offsets { struct Prestige { u32 offset = 0x000000; char da
我不明白 C++ 中的某些东西,gcc 不喜欢我如何进行。 我做到了: if (!fModeMdi) MyFirstClass* main = (MyFirstClas
在 switch-case 语句中,declaration-with-initialization 是无效的,但允许 declaration-and-then-assignment。如以下代码片段所示
我在我的界面文件中收到一条奇怪的警告。 这也出现在我为此声明属性的那一行。 谁能帮帮我? 最佳答案 在您的项目中的某处,您有一个 #define 将 xOffset 定义为空(除了注释)。像这样: #
declare +x 下面做了什么? (特定于 Bash。)我理解 declare -x,但不理解 declare +x: function the_func { declare +x MY_VA
由于我是 Symfony 的新手,我尝试使用 Doctrine 创建实体关系。我收到错误 “[bundle/entity/file_location”中的属性“report”已经声明,但在我尝试更新架
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Imp
这是给我错误的代码: TAdvSmoothDockItems = class(TCollection) private FOwner: TAdvSmoothDock; FOnChange: T
我对 python 很陌生,我尝试制作一个简单的 GUI 程序。但是,我遇到了一个“问题”,确切地说是一个警告,上面写着:“m”未在全局范围内定义(Python(变量未定义全局))。 我知道如果你想在
当我用 GCC 编译程序时,它会显示“警告:声明未声明任何内容 [-fpermissive]”。 有问题的代码如下: typedef int BOOL; 如何清除警告? 最佳答案 您可以尝试以下操作。
我正在编写一个包含键值对集合的重要类,在编译期间我收到一个我无法弄清楚的非常奇怪的错误。在一个与这里的函数非常相似的函数中,但由于所需代码的复杂性而没有上下文,我收到错误: TValue& opera
这个问题很简单。为了进一步阐明,下面代码中的 Foo1 和 Foo2 在它们的声明方式方面到底有什么区别(例如,使用 class Foo1 { 。 .. }; 而另一个使用 typedef class
我正在开发 Web 项目,并且在从 Oracle 数据库迁移到 mysql 数据库时遇到一些问题。我想用这段代码创建函数: DROP FUNCTION IF EXISTS F_MANIFEST_GAB
是否有一个标志可以传递给 gcc 以禁用此警告?我知道它的作用,但这对我的程序来说无关紧要。 编辑:我只想禁用警告,保持代码不变。编译以下代码会生成警告: struct post{ unsigne
我是一名优秀的程序员,十分优秀!