opencv 貝葉斯分類

示例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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章