示例1:
opencv官方代碼小改。以座標系上的幾個標註點爲訓練集,用訓練得到的模型把整個座標系的點分類標註。
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/ml.hpp>
using namespace cv;
using namespace cv::ml;
int main(int, char**)
{
// 樣本數據
int labels[4] = { 1, 1, -3, -1 };
float trainingData[4][2] = { { 10, 10 },{ 10, 20 },{ 450, 100 },{ 150, 400 } };
// 封裝數據
Mat labelsMat(4, 1, CV_32SC1, labels);
Mat trainingDataMat(4, 2, CV_32F, trainingData);
// 訓練
// 創建貝葉斯分類器
Ptr<NormalBayesClassifier> Bayes = NormalBayesClassifier::create();
#if 1
Bayes->train(trainingDataMat, ROW_SAMPLE, labelsMat);
#else
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
Bayes->train(tData);
#endif
// 預測
// Data for visual representation
int width = 512, height = 512;
Mat image = Mat::zeros(height, width, CV_8UC3);
// Show the decision regions given by the SVM
Vec3b green(0, 255, 0), blue(255, 0, 0), red(40, 80, 170);
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 = Bayes->predict(sampleMat);
if (response == 1)
image.at<Vec3b>(i, j) = green;
else if (response == -1)
image.at<Vec3b>(i, j) = blue;
else
image.at<Vec3b>(i, j) = red;
}
}
// Show the training data
int thickness = -1;
circle(image, Point(501, 10), 5, Scalar(0, 0, 0), thickness);
circle(image, Point(255, 10), 5, Scalar(255, 255, 255), thickness);
circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness);
circle(image, Point(10, 501), 5, Scalar(255, 255, 255), thickness);
imwrite("bayes-result.png", image); // save the image
imshow("Bayes Simple Example", image); // show it to the user
waitKey();
return 0;
}
示例2:
將發熱數據作爲訓練集,對新的數據分類。引自https://blog.csdn.net/yueyueniaolzp/article/details/85263859
#include "opencv2/opencv.hpp"
#include "opencv2/ml.hpp"
#include <iostream>
using namespace cv;
using namespace cv::ml;
using namespace std;
int main(int argc, char** argv)
{
//樣本數據
float trainingData[10][3] = {
{ 34,1,1 },
{ 35,2,2 },
{ 36,3,3 },
{ 37,8,4 },
{ 38,9,5 },
{ 39,10,6 },
{ 40,7,7 },
{ 41,4,8 },
{ 42,5,9 },
{ 43,6,10 }
};
float labels[10] = { 1,1,1,-1,-1,-1,0,0,0,0 };
//封裝數據
Mat trainingDataMat(10, 3, CV_32FC1, trainingData);
Mat labelsMat(10, 1, CV_32SC1, labels); //標籤值,1代表冷感冒,-1代表肺炎,0代表熱感冒
//訓練
//創建正態貝葉斯分類器
Ptr<NormalBayesClassifier> model = NormalBayesClassifier::create();
model->train(trainingDataMat, ROW_SAMPLE, labelsMat);
//預測
//已知的測試樣本導入並進行分類器預測
float myData[3] = { 40, 8, 10 };
Mat myDataMat(1, 3, CV_32FC1, myData);
float r = model->predict(myDataMat);
int result = r;
//結果輸出
string output;
switch (result)
{
case 1:
output = "Cold-cold";
break;
case -1:
output = "Pneumonia";
break;
case 0:
output = "Hot-cold";
break;
default:
output = "Healthy";
break;
}
cout << endl << "The patient's disease was diagnosed as : " << output << endl << endl;
system("pause");
return 0;
}