關於libfacedetection解析及應用(待)
阿新 • • 發佈:2018-10-31
#include<opencv2\opencv.hpp> using namespace std; using namespace cv; using namespace cv::ml; int main() { //訓練需要用到的資料 int label[4] = { 1, 2, 3, 4 }; float train[4][2] = { { 31, 12 }, { 65, 220 }, { 440, 350 }, { 400, 400 } }; //轉為Mat以呼叫 Mat TRAIN(4, 2, CV_32FC1, train); Mat LABEL(4, 1, CV_32SC1, label); //訓練的初始化 Ptr<SVM> svm = SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::LINEAR); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); //開始訓練 svm->train(TRAIN, ROW_SAMPLE, LABEL); //-----------無關緊要的美工的部分----------------------- //----其實對每個畫素點的座標也進行了分類---------------- //int W = 512, H = 512; //Mat img = Mat::zeros(H, W, CV_8UC3); //Vec3b green(0, 255, 0), blue(255, 0, 0), red(0, 0, 255), black(0, 0, 0); //for (int i = 0; i < img.rows; ++i) //for (int j = 0; j < img.cols; ++j) //{ // Mat sampleMat = (Mat_<float>(1, 2) << j, i); // float response = svm->predict(sampleMat); // if (response == 1) // img.at<Vec3b>(i, j) = green; // else if (response == 2) // img.at<Vec3b>(i, j) = blue; // else if (response == 3) // img.at<Vec3b>(i, j) = red; // else if (response == 4) // img.at<Vec3b>(i, j) = black; //} ////--------把初始化訓練的點畫進圖片------------ //int thickness = -1; //int lineType = 8; //for (int i = 0; i < sizeof(label) / sizeof(int);i++) { // circle(img, Point(train[i][0], train[i][1]), 10, Scalar(255, 255, 255), thickness, -1); // cout << "sizeof(label):" << sizeof(label) << endl; // cout << "sizeof(int):" << sizeof(int) << endl; //} //// 把 support vectors cout粗來看看…… //Mat sv = svm->getSupportVectors(); //cout << "Support Vectors為:" << endl; //for (int i = 0; i < sv.rows; ++i) //{ // const float* v = sv.ptr<float>(i); // cout << v[0] << " " << v[1] << endl; //} //測試測試 Mat dst; float testData[2][2] = { { 31, 11 }, { 61, 221 } }; Mat testMat(2, 2, CV_32FC1, testData); svm->predict(testMat, dst); cout << "分類結果為:" << endl; cout << dst; //imshow("SVM顯示", img); waitKey(-1); }