From 007ed02f59bed3ba3dd05edd404d86d151d22a35 Mon Sep 17 00:00:00 2001 From: USW Date: Wed, 28 May 2025 12:11:05 +0900 Subject: [PATCH] =?UTF-8?q?svm=EA=B3=BC=20=EB=A8=B8=EC=8B=A0=EB=9F=AC?= =?UTF-8?q?=EB=8B=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Capstone_Design.sln | 46 ++++++++ ch15/knndigits/knndigits.vcxproj | 142 +++++++++++++++++++++++ ch15/knndigits/knndigits.vcxproj.filters | 27 +++++ ch15/knndigits/main.cpp | 83 +++++++++++++ ch15/knnplane/knnplane.vcxproj | 139 ++++++++++++++++++++++ ch15/knnplane/knnplane.vcxproj.filters | 22 ++++ ch15/knnplane/main.cpp | 98 ++++++++++++++++ ch15/svmdigits/main.cpp | 91 +++++++++++++++ ch15/svmdigits/svmdigits.vcxproj | 139 ++++++++++++++++++++++ ch15/svmdigits/svmdigits.vcxproj.filters | 22 ++++ ch15/svmplane/main.cpp | 48 ++++++++ ch15/svmplane/svmplane.vcxproj | 139 ++++++++++++++++++++++ ch15/svmplane/svmplane.vcxproj.filters | 22 ++++ 13 files changed, 1018 insertions(+) create mode 100644 ch15/knndigits/knndigits.vcxproj create mode 100644 ch15/knndigits/knndigits.vcxproj.filters create mode 100644 ch15/knndigits/main.cpp create mode 100644 ch15/knnplane/knnplane.vcxproj create mode 100644 ch15/knnplane/knnplane.vcxproj.filters create mode 100644 ch15/knnplane/main.cpp create mode 100644 ch15/svmdigits/main.cpp create mode 100644 ch15/svmdigits/svmdigits.vcxproj create mode 100644 ch15/svmdigits/svmdigits.vcxproj.filters create mode 100644 ch15/svmplane/main.cpp create mode 100644 ch15/svmplane/svmplane.vcxproj create mode 100644 ch15/svmplane/svmplane.vcxproj.filters diff --git a/Capstone_Design.sln b/Capstone_Design.sln index 3c1ba0e..e6a0dd2 100644 --- a/Capstone_Design.sln +++ b/Capstone_Design.sln @@ -99,6 +99,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "matching", "ch14\matching\m EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stitching", "Homework\stitching\stitching.vcxproj", "{16DCB3B7-0FDC-43AD-902E-196F0F94DD02}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch15", "ch15", "{CCC97EA5-97BB-4D09-BF37-E5E4A2121DCF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "knnplane", "ch15\knnplane\knnplane.vcxproj", "{276520F2-0DBF-4CED-8C0C-B51ED16D493E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "knndigits", "ch15\knndigits\knndigits.vcxproj", "{123FE185-68CE-4E6E-B5D6-384980997681}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "svmplane", "ch15\svmplane\svmplane.vcxproj", "{773FC1DE-F4AD-4771-B624-1A6997E8EA6A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "svmdigits", "ch15\svmdigits\svmdigits.vcxproj", "{3FAC1456-4F85-4254-97D9-86667B64B217}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -379,6 +389,38 @@ Global {16DCB3B7-0FDC-43AD-902E-196F0F94DD02}.Release|x64.Build.0 = Release|x64 {16DCB3B7-0FDC-43AD-902E-196F0F94DD02}.Release|x86.ActiveCfg = Release|Win32 {16DCB3B7-0FDC-43AD-902E-196F0F94DD02}.Release|x86.Build.0 = Release|Win32 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Debug|x64.ActiveCfg = Debug|x64 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Debug|x64.Build.0 = Debug|x64 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Debug|x86.ActiveCfg = Debug|Win32 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Debug|x86.Build.0 = Debug|Win32 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Release|x64.ActiveCfg = Release|x64 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Release|x64.Build.0 = Release|x64 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Release|x86.ActiveCfg = Release|Win32 + {276520F2-0DBF-4CED-8C0C-B51ED16D493E}.Release|x86.Build.0 = Release|Win32 + {123FE185-68CE-4E6E-B5D6-384980997681}.Debug|x64.ActiveCfg = Debug|x64 + {123FE185-68CE-4E6E-B5D6-384980997681}.Debug|x64.Build.0 = Debug|x64 + {123FE185-68CE-4E6E-B5D6-384980997681}.Debug|x86.ActiveCfg = Debug|Win32 + {123FE185-68CE-4E6E-B5D6-384980997681}.Debug|x86.Build.0 = Debug|Win32 + {123FE185-68CE-4E6E-B5D6-384980997681}.Release|x64.ActiveCfg = Release|x64 + {123FE185-68CE-4E6E-B5D6-384980997681}.Release|x64.Build.0 = Release|x64 + {123FE185-68CE-4E6E-B5D6-384980997681}.Release|x86.ActiveCfg = Release|Win32 + {123FE185-68CE-4E6E-B5D6-384980997681}.Release|x86.Build.0 = Release|Win32 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Debug|x64.ActiveCfg = Debug|x64 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Debug|x64.Build.0 = Debug|x64 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Debug|x86.ActiveCfg = Debug|Win32 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Debug|x86.Build.0 = Debug|Win32 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Release|x64.ActiveCfg = Release|x64 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Release|x64.Build.0 = Release|x64 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Release|x86.ActiveCfg = Release|Win32 + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A}.Release|x86.Build.0 = Release|Win32 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Debug|x64.ActiveCfg = Debug|x64 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Debug|x64.Build.0 = Debug|x64 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Debug|x86.ActiveCfg = Debug|Win32 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Debug|x86.Build.0 = Debug|Win32 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Release|x64.ActiveCfg = Release|x64 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Release|x64.Build.0 = Release|x64 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Release|x86.ActiveCfg = Release|Win32 + {3FAC1456-4F85-4254-97D9-86667B64B217}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -418,6 +460,10 @@ Global {0A03E1F6-AE40-4F86-B0E6-152B7D6C7820} = {9DEF9106-146A-4E03-B4E3-9CF41F9844DC} {2345724D-8858-4CBF-A8E4-98947BC56DF1} = {9DEF9106-146A-4E03-B4E3-9CF41F9844DC} {16DCB3B7-0FDC-43AD-902E-196F0F94DD02} = {E583E257-9FCE-4A4B-A554-8514F982D1BF} + {276520F2-0DBF-4CED-8C0C-B51ED16D493E} = {CCC97EA5-97BB-4D09-BF37-E5E4A2121DCF} + {123FE185-68CE-4E6E-B5D6-384980997681} = {CCC97EA5-97BB-4D09-BF37-E5E4A2121DCF} + {773FC1DE-F4AD-4771-B624-1A6997E8EA6A} = {CCC97EA5-97BB-4D09-BF37-E5E4A2121DCF} + {3FAC1456-4F85-4254-97D9-86667B64B217} = {CCC97EA5-97BB-4D09-BF37-E5E4A2121DCF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E1A0C3F4-F16D-4626-86CE-D8484C0C776D} diff --git a/ch15/knndigits/knndigits.vcxproj b/ch15/knndigits/knndigits.vcxproj new file mode 100644 index 0000000..ca3b10f --- /dev/null +++ b/ch15/knndigits/knndigits.vcxproj @@ -0,0 +1,142 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {123fe185-68ce-4e6e-b5d6-384980997681} + knndigits + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/ch15/knndigits/knndigits.vcxproj.filters b/ch15/knndigits/knndigits.vcxproj.filters new file mode 100644 index 0000000..8b1bcc3 --- /dev/null +++ b/ch15/knndigits/knndigits.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 소스 파일 + + + + + 리소스 파일 + + + \ No newline at end of file diff --git a/ch15/knndigits/main.cpp b/ch15/knndigits/main.cpp new file mode 100644 index 0000000..e23142a --- /dev/null +++ b/ch15/knndigits/main.cpp @@ -0,0 +1,83 @@ +#include "opencv2/opencv.hpp" +#include + +using namespace cv; +using namespace cv::ml; +using namespace std; + +Ptr train_knn(); + +void on_mouse(int event, int x, int y, int flags, void* userdata); + +int main() { + Ptr knn = train_knn(); + + Mat img = Mat::zeros(400, 400, CV_8U); + + imshow("img", img); + setMouseCallback("img", on_mouse, (void*)&img); + + while (true) { + int c = waitKey(0); + + if (c == 27) + break; + else if (c == ' ') { + Mat img_resize, img_float, img_flatten, res; + + resize(img, img_resize, Size(20, 20), 0, 0, INTER_AREA); + img_resize.convertTo(img_float, CV_32F); + img_flatten = img_float.reshape(1, 1); + + knn->findNearest(img_flatten, 3, res); + cout << cvRound(res.at(0, 0)) << endl; + + img.setTo(0); + imshow("img", img); + } + } + + return 0; +} + +Ptr train_knn() { + Mat digits = imread("../../resources/images/digits.png", IMREAD_GRAYSCALE); + + Mat train_images, train_labels; + + for (int j = 0; j < 50; j++) { + for (int i = 0; i < 100; i++) { + Mat roi, roi_float, roi_flatten; + roi = digits(Rect(i * 20, j * 20, 20, 20)); + roi.convertTo(roi_float, CV_32F); + roi_flatten = roi_float.reshape(1, 1); + + train_images.push_back(roi_flatten); + train_labels.push_back(j / 5); + } + } + + Ptr knn = KNearest::create(); + knn->train(train_images, ROW_SAMPLE, train_labels); + + return knn; +} + +Point ptPrev(-1, -1); + +void on_mouse(int event, int x, int y, int flags, void* userdata) { + Mat img = *(Mat*)userdata; + + if (event == EVENT_LBUTTONDOWN) { + ptPrev = Point(x, y); + } + else if (event == EVENT_LBUTTONUP) { + ptPrev = Point(-1, -1); + } + else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) { + line(img, ptPrev, Point(x, y), Scalar::all(255), 40, LINE_AA, 0); + ptPrev = Point(x, y); + + imshow("img", img); + } +} \ No newline at end of file diff --git a/ch15/knnplane/knnplane.vcxproj b/ch15/knnplane/knnplane.vcxproj new file mode 100644 index 0000000..986349b --- /dev/null +++ b/ch15/knnplane/knnplane.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {276520f2-0dbf-4ced-8c0c-b51ed16d493e} + knnplane + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/ch15/knnplane/knnplane.vcxproj.filters b/ch15/knnplane/knnplane.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch15/knnplane/knnplane.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 소스 파일 + + + \ No newline at end of file diff --git a/ch15/knnplane/main.cpp b/ch15/knnplane/main.cpp new file mode 100644 index 0000000..202bee6 --- /dev/null +++ b/ch15/knnplane/main.cpp @@ -0,0 +1,98 @@ +#include "opencv2/opencv.hpp" +#include + +using namespace cv; +using namespace cv::ml; +using namespace std; + +Mat img; +Mat train, label; +Ptr knn; +int k_value = 1; + +void on_k_changed(int k, void* userdata); +void addPoint(const Point& pt, int cls); +void trainAndDisplay(); + +int main() { + img = Mat::zeros(Size(500, 500), CV_8UC3); + knn = KNearest::create(); + + const int NUM = 30; + Mat rn(NUM, 2, CV_32SC1); + + randn(rn, 0, 50); + for (int i = 0; i < NUM; i++) { + addPoint(Point(rn.at(i, 0) + 150, rn.at(i, 1) + 150), 0); + } + randn(rn, 0, 50); + for (int i = 0; i < NUM; i++) { + addPoint(Point(rn.at(i, 0) + 350, rn.at(i, 1) + 150), 1); + } + randn(rn, 0, 70); + for (int i = 0; i < NUM; i++) { + addPoint(Point(rn.at(i, 0) + 250, rn.at(i, 1) + 400), 2); + } + + namedWindow("knn"); + createTrackbar("k", "knn", &k_value, 10, on_k_changed); + + trainAndDisplay(); + + waitKey(); + destroyAllWindows(); + return 0; +} + +void on_k_changed(int k, void* userdata) { + if (k_value < 1) { + k_value = 1; + } else { + k_value = k; + } + trainAndDisplay(); +} + +void addPoint(const Point& pt, int cls) { + Mat new_sample = (Mat_(1, 2) << pt.x, pt.y); + train.push_back(new_sample); + + Mat new_label = (Mat_(1, 1) << cls); + label.push_back(new_label); +} + +void trainAndDisplay() { + knn->train(train, ROW_SAMPLE, label); + + for (int i = 0; i < img.rows; i++) { + for (int j = 0; j < img.cols; j++) { + Mat sample = (Mat_(1, 2) << j, i); + + Mat res; + knn->findNearest(sample, k_value, res); + + int response = cvRound(res.at(0, 0)); + if (response == 0) + img.at(i, j) = Vec3b(128, 128, 255); + if (response == 1) + img.at(i, j) = Vec3b(128, 255, 128); + if (response == 2) + img.at(i, j) = Vec3b(255, 128, 128); + } + } + + for (int i = 0; i < train.rows; i++) { + int x = cvRound(train.at(i, 0)); + int y = cvRound(train.at(i, 1)); + int l = label.at(i, 0); + + if (l == 0) + circle(img, Point(x, y), 5, Scalar(0, 0, 128), -1, LINE_AA); + if (l == 1) + circle(img, Point(x, y), 5, Scalar(0, 128, 0), -1, LINE_AA); + if (l == 2) + circle(img, Point(x, y), 5, Scalar(128, 0, 0), -1, LINE_AA); + } + + imshow("knn", img); +} \ No newline at end of file diff --git a/ch15/svmdigits/main.cpp b/ch15/svmdigits/main.cpp new file mode 100644 index 0000000..591e27c --- /dev/null +++ b/ch15/svmdigits/main.cpp @@ -0,0 +1,91 @@ +#include "opencv2/opencv.hpp" +#include + +using namespace cv; +using namespace cv::ml; +using namespace std; + +Ptr train_hog_svm(const HOGDescriptor& hog); + +void on_mouse(int event, int x, int y, int flags, void* userdata); + +int main() { + HOGDescriptor hog(Size(20, 20), Size(10, 10), Size(5, 5), Size(5, 5), 9); + Ptr svm = train_hog_svm(hog); + + Mat img = Mat::zeros(400, 400, CV_8U); + + imshow("img", img); + setMouseCallback("img", on_mouse, (void*)&img); + + while (true) { + int c = waitKey(0); + + if (c == 27) + break; + else if (c == ' ') { + Mat img_resize; + + resize(img, img_resize, Size(20, 20), 0, 0, INTER_AREA); + + vector desc; + hog.compute(img_resize, desc); + + Mat desc_mat(desc); + int res = cvRound(svm->predict(desc_mat.t())); + cout << res << endl; + + img.setTo(0); + imshow("img", img); + } + } + + return 0; +} + +Ptr train_hog_svm(const HOGDescriptor& hog) { + Mat digits = imread("../../resources/images/digits.png", IMREAD_GRAYSCALE); + + Mat train_hog, train_labels; + + for (int j = 0; j < 50; j++) { + for (int i = 0; i < 100; i++) { + Mat roi = digits(Rect(i * 20, j * 20, 20, 20)); + + vector desc; + hog.compute(roi, desc); + + Mat desc_mat(desc); + train_hog.push_back(desc_mat.t()); + train_labels.push_back(j / 5); + } + } + + Ptr svm = SVM::create(); + svm->setType(SVM::Types::C_SVC); + svm->setKernel(SVM::KernelTypes::RBF); + svm->setC(2.5); + svm->setGamma(0.50625); + svm->train(train_hog, ROW_SAMPLE, train_labels); + + return svm; +} + +Point ptPrev(-1, -1); + +void on_mouse(int event, int x, int y, int flags, void* userdata) { + Mat img = *(Mat*)userdata; + + if (event == EVENT_LBUTTONDOWN) { + ptPrev = Point(x, y); + } + else if (event == EVENT_LBUTTONUP) { + ptPrev = Point(-1, -1); + } + else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) { + line(img, ptPrev, Point(x, y), Scalar::all(255), 40, LINE_AA, 0); + ptPrev = Point(x, y); + + imshow("img", img); + } +} \ No newline at end of file diff --git a/ch15/svmdigits/svmdigits.vcxproj b/ch15/svmdigits/svmdigits.vcxproj new file mode 100644 index 0000000..3a991d6 --- /dev/null +++ b/ch15/svmdigits/svmdigits.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {3fac1456-4f85-4254-97d9-86667b64b217} + svmdigits + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/ch15/svmdigits/svmdigits.vcxproj.filters b/ch15/svmdigits/svmdigits.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch15/svmdigits/svmdigits.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 소스 파일 + + + \ No newline at end of file diff --git a/ch15/svmplane/main.cpp b/ch15/svmplane/main.cpp new file mode 100644 index 0000000..9f8a870 --- /dev/null +++ b/ch15/svmplane/main.cpp @@ -0,0 +1,48 @@ +#include "opencv2/opencv.hpp" +#include + +using namespace cv; +using namespace cv::ml; +using namespace std; + +int main() { + Mat train = Mat_({ 8, 2 }, { + 150, 200, 200, 250, 100, 250, 150, 300, + 350, 100, 400, 200, 400, 300, 350, 400 }); + Mat label = Mat_({ 8, 1 }, { 0, 0, 0, 0, 1, 1, 1, 1 }); + + Ptr svm = SVM::create(); + svm->setType(SVM::Types::C_SVC); + svm->setKernel(SVM::KernelTypes::RBF); + svm->trainAuto(train, ROW_SAMPLE, label); + + Mat img = Mat::zeros(Size(500, 500), CV_8UC3); + + for (int j = 0; j < img.rows; j++) { + for (int i = 0; i < img.cols; i++) { + Mat test = Mat_({ 1, 2 }, { (float)i, (float)j }); + int res = cvRound(svm->predict(test)); + + if (res == 0) + img.at(j, i) = Vec3b(128, 128, 255); + else + img.at(j, i) = Vec3b(128, 255, 128); + } + } + + for (int i = 0; i < train.rows; i++) { + int x = cvRound(train.at(i, 0)); + int y = cvRound(train.at(i, 1)); + int l = label.at(i, 0); + + if (l == 0) + circle(img, Point(x, y), 5, Scalar(0, 0, 128), -1, LINE_AA); + else + circle(img, Point(x, y), 5, Scalar(0, 128, 0), -1, LINE_AA); + } + + imshow("img", img); + + waitKey(); + return 0; +} \ No newline at end of file diff --git a/ch15/svmplane/svmplane.vcxproj b/ch15/svmplane/svmplane.vcxproj new file mode 100644 index 0000000..9bdc4a1 --- /dev/null +++ b/ch15/svmplane/svmplane.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {773fc1de-f4ad-4771-b624-1a6997e8ea6a} + svmplane + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/ch15/svmplane/svmplane.vcxproj.filters b/ch15/svmplane/svmplane.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch15/svmplane/svmplane.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 소스 파일 + + + \ No newline at end of file