支持向量机c++教程
Tutorials for SVM with c++
我正在尝试用c++将SVM用于对象检测。我遵循这个答案。我面临的一个问题是CvSVM目前尚未使用。因此,我对培训代码进行了如下修改。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
using namespace cv;
using namespace cv::ml;
int main()
{
// Data for visual representation
int width = 512, height = 512;
Mat image = Mat::zeros(height, width, CV_8UC3);
// Set up training data
float labels[4] = {1.0, -1.0, -1.0, -1.0};
Mat labelsMat(4, 1, CV_32FC1, labels);
float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
// Set up SVM's parameters
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
//svm.term_crit = SVM::getTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
// Train the SVM
//Ptr<SVM> svm1 = SVM::trainAuto();
SVM->train(trainingDataMat, labelsMat, Mat(), Mat(), svm);
Vec3b green(0,255,0), blue (255,0,0);
// Show the decision regions given by the SVM
for (int i = 0; i < image.rows; ++i)
for (int j = 0; j < image.cols; ++j)
{
Mat sampleMat = (Mat_<float>(1,2) << j,i);
float response = svm->predict(sampleMat);
if (response == 1)
image.at<Vec3b>(i,j) = green;
else if (response == -1)
image.at<Vec3b>(i,j) = blue;
}
// Show the training data
int thickness = -1;
int lineType = 8;
circle( image, Point(501, 10), 5, Scalar( 0, 0, 0), thickness, lineType);
circle( image, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType);
circle( image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);
circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);
// Show support vectors
thickness = 2;
lineType = 8;
int c = SVM.get_support_vector_count();
for (int i = 0; i < c; ++i)
{
const float* v = SVM.get_support_vector(i);
circle( image, Point( (int) v[0], (int) v[1]), 6, Scalar(128, 128, 128), thickness, lineType);
}
imwrite("result.png", image); // save the image
imshow("SVM Simple Example", image); // show it to the user
waitKey(0);
}
我无法执行列车功能。上面说找不到函数。请帮助我使用此代码的更新版本。
您的代码中有几个错误。有些是C++语法错误,有些是由于您使用的是与OpenCV3.0不同的OpenCV2.4.XAPI
1) 当您引用svm实例时,应该使用svm
(变量名),而不是SVM
(类名)。
2) 在分类问题的情况下,回答必须是分类的。所以
float labels[4] = { 1.0, -1.0, -1.0, -1.0 };
Mat labelsMat(4, 1, CV_32FC1, labels);
应该是:
int labels[4] = { 1, -1, -1, -1 };
Mat labelsMat(4, 1, CV_32SC1, labels);
3) train
接受不同的参数。SVM->train(trainingDataMat, labelsMat, Mat(), Mat(), svm);
应为:svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);
4) OpenCV 3.0中不存在get_support_vector_count
。int c = SVM.get_support_vector_count();
应为:int c = svm->getSupportVectors().rows;
5) get_support_vector
在OpenCV 3.0中不存在。const float* v = SVM.get_support_vector(i);
应为:const float* v = svm->getSupportVectors().ptr<float>(i);
此答案中的代码已按预期工作。如果你引入这样的错误,显然是行不通的。
相关文章:
- LLVM 万花筒教程 JIT 编译问题
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- CMakeLists.txt:(add_executable):没有给目标提供来源:教程
- 使用mingw遵循简单的c ++ DLL教程时出错
- 使用Bazel C++教程;build不创建/使用共享库
- 虚幻引擎4教程不适用于Visual Studio 17
- 如何编译LLVM万花筒教程?
- 虚幻文档中教程项目中的错误
- 编译C 电池收集器教程的错误
- static_assert HANA 教程中的非constexpr对象
- 在遵循 OpenCV 3.4.0 AKAZE 和 ORB 平面跟踪教程时找不到 Points() 函数
- 不了解 learnopengl.com 中漫辐照度教程中的捕获视图
- Freetype库不带有教程代码
- NAO机器人优化了对图像教程的访问
- SDL/C++ && Operator - Lazyfoo 教程
- 用于创建 Windows 应用程序的 MSDN 应用程序教程
- 无法运行 swig 教程
- Tensorflow - Deep MNIST 教程 - 将分类器导出到C++
- XAudio2 教程 - 单独的线程和异步读取?