From f2f018da0c24a289a69903405ffe509264376c76 Mon Sep 17 00:00:00 2001 From: USW Date: Wed, 2 Apr 2025 12:07:31 +0900 Subject: [PATCH] =?UTF-8?q?6=EC=A3=BC=EC=B0=A8=20=EC=88=98=EC=97=85=20?= =?UTF-8?q?=EB=81=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Capstone_Design.sln | 174 +++++++++++++++--- Drawing/Drawing.zip | Bin 26212 -> 0 bytes Homework/noise_denoise/noise_denoise.vcxproj | 138 ++++++++++++++ .../noise_denoise.vcxproj.filters | 17 ++ {HelloCV => ch01/HelloCV}/HelloCV.vcxproj | 8 +- .../HelloCV}/HelloCV.vcxproj.filters | 0 {HelloCV => ch01/HelloCV}/main.cpp | 2 +- {HelloCV => ch01/HelloCV}/main2.cpp | 0 .../HelloWorld}/HelloWorld.vcxproj | 0 .../HelloWorld}/HelloWorld.vcxproj.filters | 0 {HelloWorld => ch01/HelloWorld}/main.cpp | 0 {MatOp => ch03/MatOp}/MatOp.vcxproj | 8 +- {MatOp => ch03/MatOp}/MatOp.vcxproj.filters | 0 {MatOp => ch03/MatOp}/main.cpp | 4 +- .../Point_Class}/Point_Class.vcxproj | 8 +- .../Point_Class}/Point_Class.vcxproj.filters | 0 {Point_Class => ch03/Point_Class}/main.cpp | 0 {Drawing => ch04/Drawing}/Drawing.vcxproj | 8 +- .../Drawing}/Drawing.vcxproj.filters | 0 {Drawing => ch04/Drawing}/main.cpp | 0 {Video => ch04/Video}/Video.vcxproj | 8 +- {Video => ch04/Video}/Video.vcxproj.filters | 0 {Video => ch04/Video}/main.cpp | 0 ch05/brightness/brightness.vcxproj | 142 ++++++++++++++ ch05/brightness/brightness.vcxproj.filters | 27 +++ ch05/brightness/main.cpp | 111 +++++++++++ ch05/contrast/contrast.vcxproj | 139 ++++++++++++++ ch05/contrast/contrast.vcxproj.filters | 22 +++ ch05/contrast/main.cpp | 68 +++++++ ch05/histogram/histogram.vcxproj | 145 +++++++++++++++ ch05/histogram/histogram.vcxproj.filters | 32 ++++ ch05/histogram/main.cpp | 81 ++++++++ ch06/Arithmetic/Arithmetic.vcxproj | 148 +++++++++++++++ ch06/Arithmetic/Arithmetic.vcxproj.filters | 41 +++++ ch06/Arithmetic/main.cpp | 82 +++++++++ ch06/logical/logical.vcxproj | 143 ++++++++++++++ ch06/logical/logical.vcxproj.filters | 30 +++ ch06/logical/main.cpp | 29 +++ ch07/blurring/blurring.vcxproj | 139 ++++++++++++++ ch07/blurring/blurring.vcxproj.filters | 22 +++ ch07/blurring/main.cpp | 24 +++ ch07/noise/main.cpp | 52 ++++++ ch07/noise/noise.vcxproj | 139 ++++++++++++++ ch07/noise/noise.vcxproj.filters | 22 +++ ch07/sharpen/main.cpp | 31 ++++ ch07/sharpen/sharpen.vcxproj | 139 ++++++++++++++ ch07/sharpen/sharpen.vcxproj.filters | 22 +++ cn06/filter/filter.vcxproj | 142 ++++++++++++++ cn06/filter/filter.vcxproj.filters | 27 +++ cn06/filter/main.cpp | 76 ++++++++ 50 files changed, 2399 insertions(+), 51 deletions(-) delete mode 100644 Drawing/Drawing.zip create mode 100644 Homework/noise_denoise/noise_denoise.vcxproj create mode 100644 Homework/noise_denoise/noise_denoise.vcxproj.filters rename {HelloCV => ch01/HelloCV}/HelloCV.vcxproj (96%) rename {HelloCV => ch01/HelloCV}/HelloCV.vcxproj.filters (100%) rename {HelloCV => ch01/HelloCV}/main.cpp (84%) rename {HelloCV => ch01/HelloCV}/main2.cpp (100%) rename {HelloWorld => ch01/HelloWorld}/HelloWorld.vcxproj (100%) rename {HelloWorld => ch01/HelloWorld}/HelloWorld.vcxproj.filters (100%) rename {HelloWorld => ch01/HelloWorld}/main.cpp (100%) rename {MatOp => ch03/MatOp}/MatOp.vcxproj (97%) rename {MatOp => ch03/MatOp}/MatOp.vcxproj.filters (100%) rename {MatOp => ch03/MatOp}/main.cpp (87%) rename {Point_Class => ch03/Point_Class}/Point_Class.vcxproj (96%) rename {Point_Class => ch03/Point_Class}/Point_Class.vcxproj.filters (100%) rename {Point_Class => ch03/Point_Class}/main.cpp (100%) rename {Drawing => ch04/Drawing}/Drawing.vcxproj (96%) rename {Drawing => ch04/Drawing}/Drawing.vcxproj.filters (100%) rename {Drawing => ch04/Drawing}/main.cpp (100%) rename {Video => ch04/Video}/Video.vcxproj (96%) rename {Video => ch04/Video}/Video.vcxproj.filters (100%) rename {Video => ch04/Video}/main.cpp (100%) create mode 100644 ch05/brightness/brightness.vcxproj create mode 100644 ch05/brightness/brightness.vcxproj.filters create mode 100644 ch05/brightness/main.cpp create mode 100644 ch05/contrast/contrast.vcxproj create mode 100644 ch05/contrast/contrast.vcxproj.filters create mode 100644 ch05/contrast/main.cpp create mode 100644 ch05/histogram/histogram.vcxproj create mode 100644 ch05/histogram/histogram.vcxproj.filters create mode 100644 ch05/histogram/main.cpp create mode 100644 ch06/Arithmetic/Arithmetic.vcxproj create mode 100644 ch06/Arithmetic/Arithmetic.vcxproj.filters create mode 100644 ch06/Arithmetic/main.cpp create mode 100644 ch06/logical/logical.vcxproj create mode 100644 ch06/logical/logical.vcxproj.filters create mode 100644 ch06/logical/main.cpp create mode 100644 ch07/blurring/blurring.vcxproj create mode 100644 ch07/blurring/blurring.vcxproj.filters create mode 100644 ch07/blurring/main.cpp create mode 100644 ch07/noise/main.cpp create mode 100644 ch07/noise/noise.vcxproj create mode 100644 ch07/noise/noise.vcxproj.filters create mode 100644 ch07/sharpen/main.cpp create mode 100644 ch07/sharpen/sharpen.vcxproj create mode 100644 ch07/sharpen/sharpen.vcxproj.filters create mode 100644 cn06/filter/filter.vcxproj create mode 100644 cn06/filter/filter.vcxproj.filters create mode 100644 cn06/filter/main.cpp diff --git a/Capstone_Design.sln b/Capstone_Design.sln index cc8f0ad..619c014 100644 --- a/Capstone_Design.sln +++ b/Capstone_Design.sln @@ -9,19 +9,47 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch02", "ch02", "{513A93F1-4 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch03", "ch03", "{5A922B9F-8CAA-418C-9D2A-C2F26CCF7059}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Point_Class", "Point_Class\Point_Class.vcxproj", "{A18B353C-A08C-4EBE-92D6-2D280A16A6BB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HelloCV", "HelloCV\HelloCV.vcxproj", "{9466991C-83CD-4753-90EB-A20C12368EAC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HelloWorld", "HelloWorld\HelloWorld.vcxproj", "{682942EC-3BD1-4759-A9A4-3089C2EEC799}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MatOp", "MatOp\MatOp.vcxproj", "{284ABC4B-82D9-4808-8E18-E6F7A1D05563}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch04", "ch04", "{6AD5DB3F-FAAC-4D79-9B5C-52AF61E2E052}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Video", "Video\Video.vcxproj", "{67BA8C21-12CB-440F-998D-E0DFF7B04DDF}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch05", "ch05", "{8436DD5A-9627-44A0-BA75-7706F5190DD2}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Drawing", "Drawing\Drawing.vcxproj", "{27CCD2CA-F740-43F5-8740-B30E3A2840C1}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "brightness", "ch05\brightness\brightness.vcxproj", "{A9F00664-0673-4934-B51D-A141D9C211ED}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Drawing", "ch04\Drawing\Drawing.vcxproj", "{27CCD2CA-F740-43F5-8740-B30E3A2840C1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MatOp", "ch03\MatOp\MatOp.vcxproj", "{284ABC4B-82D9-4808-8E18-E6F7A1D05563}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Point_Class", "ch03\Point_Class\Point_Class.vcxproj", "{A18B353C-A08C-4EBE-92D6-2D280A16A6BB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HelloCV", "ch01\HelloCV\HelloCV.vcxproj", "{9466991C-83CD-4753-90EB-A20C12368EAC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HelloWorld", "ch01\HelloWorld\HelloWorld.vcxproj", "{682942EC-3BD1-4759-A9A4-3089C2EEC799}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "contrast", "ch05\contrast\contrast.vcxproj", "{926B8522-38E8-41E3-A358-D9D628DFF8A4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "histogram", "ch05\histogram\histogram.vcxproj", "{D0C81788-4531-4E50-A2DE-7ADD77039FCE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Video", "ch04\Video\Video.vcxproj", "{67BA8C21-12CB-440F-998D-E0DFF7B04DDF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch06", "ch06", "{32163192-2AEE-4AF4-B246-66D99D6C131F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Arithmetic", "ch06\Arithmetic\Arithmetic.vcxproj", "{69A9CD92-339E-4CEC-8427-3A71197437D4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logical", "ch06\logical\logical.vcxproj", "{8E7C00AE-B124-4C7E-848F-F85838AFC69A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "filter", "cn06\filter\filter.vcxproj", "{8219467F-93DF-4080-8452-97E1EC422D8B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ch07", "ch07", "{E0A91F3E-0B54-4785-AB66-727A7EE1E15B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blurring", "ch07\blurring\blurring.vcxproj", "{61942C1C-14CA-49A7-B89A-4C6A8996CA6D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sharpen", "ch07\sharpen\sharpen.vcxproj", "{A871F9D8-2DD0-4B01-A304-E738968313F2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "noise", "ch07\noise\noise.vcxproj", "{380222EF-FFE1-445F-B409-1DD866DF1ED9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Homework", "Homework", "{E583E257-9FCE-4A4B-A554-8514F982D1BF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "noise_denoise", "Homework\noise_denoise\noise_denoise.vcxproj", "{C91F6DA7-8B51-4630-9340-D3643FE0531E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -31,6 +59,30 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A9F00664-0673-4934-B51D-A141D9C211ED}.Debug|x64.ActiveCfg = Debug|x64 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Debug|x64.Build.0 = Debug|x64 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Debug|x86.ActiveCfg = Debug|Win32 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Debug|x86.Build.0 = Debug|Win32 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Release|x64.ActiveCfg = Release|x64 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Release|x64.Build.0 = Release|x64 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Release|x86.ActiveCfg = Release|Win32 + {A9F00664-0673-4934-B51D-A141D9C211ED}.Release|x86.Build.0 = Release|Win32 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x64.ActiveCfg = Debug|x64 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x64.Build.0 = Debug|x64 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x86.ActiveCfg = Debug|Win32 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x86.Build.0 = Debug|Win32 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x64.ActiveCfg = Release|x64 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x64.Build.0 = Release|x64 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x86.ActiveCfg = Release|Win32 + {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x86.Build.0 = Release|Win32 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x64.ActiveCfg = Debug|x64 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x64.Build.0 = Debug|x64 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x86.ActiveCfg = Debug|Win32 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x86.Build.0 = Debug|Win32 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x64.ActiveCfg = Release|x64 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x64.Build.0 = Release|x64 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x86.ActiveCfg = Release|Win32 + {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x86.Build.0 = Release|Win32 {A18B353C-A08C-4EBE-92D6-2D280A16A6BB}.Debug|x64.ActiveCfg = Debug|x64 {A18B353C-A08C-4EBE-92D6-2D280A16A6BB}.Debug|x64.Build.0 = Debug|x64 {A18B353C-A08C-4EBE-92D6-2D280A16A6BB}.Debug|x86.ActiveCfg = Debug|Win32 @@ -55,14 +107,22 @@ Global {682942EC-3BD1-4759-A9A4-3089C2EEC799}.Release|x64.Build.0 = Release|x64 {682942EC-3BD1-4759-A9A4-3089C2EEC799}.Release|x86.ActiveCfg = Release|Win32 {682942EC-3BD1-4759-A9A4-3089C2EEC799}.Release|x86.Build.0 = Release|Win32 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x64.ActiveCfg = Debug|x64 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x64.Build.0 = Debug|x64 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x86.ActiveCfg = Debug|Win32 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Debug|x86.Build.0 = Debug|Win32 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x64.ActiveCfg = Release|x64 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x64.Build.0 = Release|x64 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x86.ActiveCfg = Release|Win32 - {284ABC4B-82D9-4808-8E18-E6F7A1D05563}.Release|x86.Build.0 = Release|Win32 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Debug|x64.ActiveCfg = Debug|x64 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Debug|x64.Build.0 = Debug|x64 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Debug|x86.ActiveCfg = Debug|Win32 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Debug|x86.Build.0 = Debug|Win32 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Release|x64.ActiveCfg = Release|x64 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Release|x64.Build.0 = Release|x64 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Release|x86.ActiveCfg = Release|Win32 + {926B8522-38E8-41E3-A358-D9D628DFF8A4}.Release|x86.Build.0 = Release|Win32 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Debug|x64.ActiveCfg = Debug|x64 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Debug|x64.Build.0 = Debug|x64 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Debug|x86.ActiveCfg = Debug|Win32 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Debug|x86.Build.0 = Debug|Win32 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Release|x64.ActiveCfg = Release|x64 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Release|x64.Build.0 = Release|x64 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Release|x86.ActiveCfg = Release|Win32 + {D0C81788-4531-4E50-A2DE-7ADD77039FCE}.Release|x86.Build.0 = Release|Win32 {67BA8C21-12CB-440F-998D-E0DFF7B04DDF}.Debug|x64.ActiveCfg = Debug|x64 {67BA8C21-12CB-440F-998D-E0DFF7B04DDF}.Debug|x64.Build.0 = Debug|x64 {67BA8C21-12CB-440F-998D-E0DFF7B04DDF}.Debug|x86.ActiveCfg = Debug|Win32 @@ -71,25 +131,83 @@ Global {67BA8C21-12CB-440F-998D-E0DFF7B04DDF}.Release|x64.Build.0 = Release|x64 {67BA8C21-12CB-440F-998D-E0DFF7B04DDF}.Release|x86.ActiveCfg = Release|Win32 {67BA8C21-12CB-440F-998D-E0DFF7B04DDF}.Release|x86.Build.0 = Release|Win32 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x64.ActiveCfg = Debug|x64 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x64.Build.0 = Debug|x64 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x86.ActiveCfg = Debug|Win32 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Debug|x86.Build.0 = Debug|Win32 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x64.ActiveCfg = Release|x64 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x64.Build.0 = Release|x64 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x86.ActiveCfg = Release|Win32 - {27CCD2CA-F740-43F5-8740-B30E3A2840C1}.Release|x86.Build.0 = Release|Win32 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Debug|x64.ActiveCfg = Debug|x64 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Debug|x64.Build.0 = Debug|x64 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Debug|x86.ActiveCfg = Debug|Win32 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Debug|x86.Build.0 = Debug|Win32 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Release|x64.ActiveCfg = Release|x64 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Release|x64.Build.0 = Release|x64 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Release|x86.ActiveCfg = Release|Win32 + {69A9CD92-339E-4CEC-8427-3A71197437D4}.Release|x86.Build.0 = Release|Win32 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Debug|x64.ActiveCfg = Debug|x64 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Debug|x64.Build.0 = Debug|x64 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Debug|x86.ActiveCfg = Debug|Win32 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Debug|x86.Build.0 = Debug|Win32 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Release|x64.ActiveCfg = Release|x64 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Release|x64.Build.0 = Release|x64 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Release|x86.ActiveCfg = Release|Win32 + {8E7C00AE-B124-4C7E-848F-F85838AFC69A}.Release|x86.Build.0 = Release|Win32 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Debug|x64.ActiveCfg = Debug|x64 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Debug|x64.Build.0 = Debug|x64 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Debug|x86.ActiveCfg = Debug|Win32 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Debug|x86.Build.0 = Debug|Win32 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Release|x64.ActiveCfg = Release|x64 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Release|x64.Build.0 = Release|x64 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Release|x86.ActiveCfg = Release|Win32 + {8219467F-93DF-4080-8452-97E1EC422D8B}.Release|x86.Build.0 = Release|Win32 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Debug|x64.ActiveCfg = Debug|x64 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Debug|x64.Build.0 = Debug|x64 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Debug|x86.ActiveCfg = Debug|Win32 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Debug|x86.Build.0 = Debug|Win32 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Release|x64.ActiveCfg = Release|x64 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Release|x64.Build.0 = Release|x64 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Release|x86.ActiveCfg = Release|Win32 + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D}.Release|x86.Build.0 = Release|Win32 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Debug|x64.ActiveCfg = Debug|x64 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Debug|x64.Build.0 = Debug|x64 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Debug|x86.ActiveCfg = Debug|Win32 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Debug|x86.Build.0 = Debug|Win32 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Release|x64.ActiveCfg = Release|x64 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Release|x64.Build.0 = Release|x64 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Release|x86.ActiveCfg = Release|Win32 + {A871F9D8-2DD0-4B01-A304-E738968313F2}.Release|x86.Build.0 = Release|Win32 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Debug|x64.ActiveCfg = Debug|x64 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Debug|x64.Build.0 = Debug|x64 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Debug|x86.ActiveCfg = Debug|Win32 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Debug|x86.Build.0 = Debug|Win32 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Release|x64.ActiveCfg = Release|x64 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Release|x64.Build.0 = Release|x64 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Release|x86.ActiveCfg = Release|Win32 + {380222EF-FFE1-445F-B409-1DD866DF1ED9}.Release|x86.Build.0 = Release|Win32 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Debug|x64.ActiveCfg = Debug|x64 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Debug|x64.Build.0 = Debug|x64 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Debug|x86.ActiveCfg = Debug|Win32 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Debug|x86.Build.0 = Debug|Win32 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Release|x64.ActiveCfg = Release|x64 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Release|x64.Build.0 = Release|x64 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Release|x86.ActiveCfg = Release|Win32 + {C91F6DA7-8B51-4630-9340-D3643FE0531E}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {A9F00664-0673-4934-B51D-A141D9C211ED} = {8436DD5A-9627-44A0-BA75-7706F5190DD2} + {27CCD2CA-F740-43F5-8740-B30E3A2840C1} = {6AD5DB3F-FAAC-4D79-9B5C-52AF61E2E052} + {284ABC4B-82D9-4808-8E18-E6F7A1D05563} = {5A922B9F-8CAA-418C-9D2A-C2F26CCF7059} {A18B353C-A08C-4EBE-92D6-2D280A16A6BB} = {5A922B9F-8CAA-418C-9D2A-C2F26CCF7059} {9466991C-83CD-4753-90EB-A20C12368EAC} = {C8D5274F-AC00-46C7-1F8D-E88E81087A52} {682942EC-3BD1-4759-A9A4-3089C2EEC799} = {C8D5274F-AC00-46C7-1F8D-E88E81087A52} - {284ABC4B-82D9-4808-8E18-E6F7A1D05563} = {5A922B9F-8CAA-418C-9D2A-C2F26CCF7059} + {926B8522-38E8-41E3-A358-D9D628DFF8A4} = {8436DD5A-9627-44A0-BA75-7706F5190DD2} + {D0C81788-4531-4E50-A2DE-7ADD77039FCE} = {8436DD5A-9627-44A0-BA75-7706F5190DD2} {67BA8C21-12CB-440F-998D-E0DFF7B04DDF} = {6AD5DB3F-FAAC-4D79-9B5C-52AF61E2E052} - {27CCD2CA-F740-43F5-8740-B30E3A2840C1} = {6AD5DB3F-FAAC-4D79-9B5C-52AF61E2E052} + {69A9CD92-339E-4CEC-8427-3A71197437D4} = {32163192-2AEE-4AF4-B246-66D99D6C131F} + {8E7C00AE-B124-4C7E-848F-F85838AFC69A} = {32163192-2AEE-4AF4-B246-66D99D6C131F} + {8219467F-93DF-4080-8452-97E1EC422D8B} = {32163192-2AEE-4AF4-B246-66D99D6C131F} + {61942C1C-14CA-49A7-B89A-4C6A8996CA6D} = {E0A91F3E-0B54-4785-AB66-727A7EE1E15B} + {A871F9D8-2DD0-4B01-A304-E738968313F2} = {E0A91F3E-0B54-4785-AB66-727A7EE1E15B} + {380222EF-FFE1-445F-B409-1DD866DF1ED9} = {E0A91F3E-0B54-4785-AB66-727A7EE1E15B} + {C91F6DA7-8B51-4630-9340-D3643FE0531E} = {E583E257-9FCE-4A4B-A554-8514F982D1BF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E1A0C3F4-F16D-4626-86CE-D8484C0C776D} diff --git a/Drawing/Drawing.zip b/Drawing/Drawing.zip deleted file mode 100644 index 51c5768fde160ac4def6bfc731968fb28f2b9c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26212 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 + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {c91f6da7-8b51-4630-9340-d3643fe0531e} + noisedenoise + 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/Homework/noise_denoise/noise_denoise.vcxproj.filters b/Homework/noise_denoise/noise_denoise.vcxproj.filters new file mode 100644 index 0000000..493ccf6 --- /dev/null +++ b/Homework/noise_denoise/noise_denoise.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {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/HelloCV/HelloCV.vcxproj b/ch01/HelloCV/HelloCV.vcxproj similarity index 96% rename from HelloCV/HelloCV.vcxproj rename to ch01/HelloCV/HelloCV.vcxproj index 799d0a2..1196409 100644 --- a/HelloCV/HelloCV.vcxproj +++ b/ch01/HelloCV/HelloCV.vcxproj @@ -59,19 +59,19 @@ - + - + - + - + diff --git a/HelloCV/HelloCV.vcxproj.filters b/ch01/HelloCV/HelloCV.vcxproj.filters similarity index 100% rename from HelloCV/HelloCV.vcxproj.filters rename to ch01/HelloCV/HelloCV.vcxproj.filters diff --git a/HelloCV/main.cpp b/ch01/HelloCV/main.cpp similarity index 84% rename from HelloCV/main.cpp rename to ch01/HelloCV/main.cpp index a34d6cd..aa21596 100644 --- a/HelloCV/main.cpp +++ b/ch01/HelloCV/main.cpp @@ -5,7 +5,7 @@ int main(int argv, char* argc[]) { std::cout << "Hello, OpenCV " << CV_VERSION << std::endl; cv::Mat img; - img = cv::imread("..\\resources\\images\\lenna.bmp"); + img = cv::imread("..\\..\\resources\\images\\lenna.bmp"); if (img.empty()) { std::cerr << "Image load failed!" << std::endl; diff --git a/HelloCV/main2.cpp b/ch01/HelloCV/main2.cpp similarity index 100% rename from HelloCV/main2.cpp rename to ch01/HelloCV/main2.cpp diff --git a/HelloWorld/HelloWorld.vcxproj b/ch01/HelloWorld/HelloWorld.vcxproj similarity index 100% rename from HelloWorld/HelloWorld.vcxproj rename to ch01/HelloWorld/HelloWorld.vcxproj diff --git a/HelloWorld/HelloWorld.vcxproj.filters b/ch01/HelloWorld/HelloWorld.vcxproj.filters similarity index 100% rename from HelloWorld/HelloWorld.vcxproj.filters rename to ch01/HelloWorld/HelloWorld.vcxproj.filters diff --git a/HelloWorld/main.cpp b/ch01/HelloWorld/main.cpp similarity index 100% rename from HelloWorld/main.cpp rename to ch01/HelloWorld/main.cpp diff --git a/MatOp/MatOp.vcxproj b/ch03/MatOp/MatOp.vcxproj similarity index 97% rename from MatOp/MatOp.vcxproj rename to ch03/MatOp/MatOp.vcxproj index cd537bd..fae819f 100644 --- a/MatOp/MatOp.vcxproj +++ b/ch03/MatOp/MatOp.vcxproj @@ -59,19 +59,19 @@ - + - + - + - + diff --git a/MatOp/MatOp.vcxproj.filters b/ch03/MatOp/MatOp.vcxproj.filters similarity index 100% rename from MatOp/MatOp.vcxproj.filters rename to ch03/MatOp/MatOp.vcxproj.filters diff --git a/MatOp/main.cpp b/ch03/MatOp/main.cpp similarity index 87% rename from MatOp/main.cpp rename to ch03/MatOp/main.cpp index d6c0066..c690afb 100644 --- a/MatOp/main.cpp +++ b/ch03/MatOp/main.cpp @@ -12,7 +12,7 @@ int main() { } void MatOp2() { - Mat img1 = imread("..\\resources\\images\\dog.bmp"); + Mat img1 = imread("..\\..\\resources\\images\\dog.bmp"); Mat img2 = img1; Mat img3; img3 = img1; @@ -34,7 +34,7 @@ void MatOp2() { } void MatOp3() { - Mat img1 = imread("..\\resources\\images\\cat.bmp"); + Mat img1 = imread("..\\..\\resources\\images\\cat.bmp"); if (img1.empty()) { cerr << "Image load failed!" << endl; diff --git a/Point_Class/Point_Class.vcxproj b/ch03/Point_Class/Point_Class.vcxproj similarity index 96% rename from Point_Class/Point_Class.vcxproj rename to ch03/Point_Class/Point_Class.vcxproj index 249d574..4423d8d 100644 --- a/Point_Class/Point_Class.vcxproj +++ b/ch03/Point_Class/Point_Class.vcxproj @@ -59,19 +59,19 @@ - + - + - + - + diff --git a/Point_Class/Point_Class.vcxproj.filters b/ch03/Point_Class/Point_Class.vcxproj.filters similarity index 100% rename from Point_Class/Point_Class.vcxproj.filters rename to ch03/Point_Class/Point_Class.vcxproj.filters diff --git a/Point_Class/main.cpp b/ch03/Point_Class/main.cpp similarity index 100% rename from Point_Class/main.cpp rename to ch03/Point_Class/main.cpp diff --git a/Drawing/Drawing.vcxproj b/ch04/Drawing/Drawing.vcxproj similarity index 96% rename from Drawing/Drawing.vcxproj rename to ch04/Drawing/Drawing.vcxproj index 6ad2af6..dafd279 100644 --- a/Drawing/Drawing.vcxproj +++ b/ch04/Drawing/Drawing.vcxproj @@ -59,19 +59,19 @@ - + - + - + - + diff --git a/Drawing/Drawing.vcxproj.filters b/ch04/Drawing/Drawing.vcxproj.filters similarity index 100% rename from Drawing/Drawing.vcxproj.filters rename to ch04/Drawing/Drawing.vcxproj.filters diff --git a/Drawing/main.cpp b/ch04/Drawing/main.cpp similarity index 100% rename from Drawing/main.cpp rename to ch04/Drawing/main.cpp diff --git a/Video/Video.vcxproj b/ch04/Video/Video.vcxproj similarity index 96% rename from Video/Video.vcxproj rename to ch04/Video/Video.vcxproj index 68f6839..1e2af41 100644 --- a/Video/Video.vcxproj +++ b/ch04/Video/Video.vcxproj @@ -59,19 +59,19 @@ - + - + - + - + diff --git a/Video/Video.vcxproj.filters b/ch04/Video/Video.vcxproj.filters similarity index 100% rename from Video/Video.vcxproj.filters rename to ch04/Video/Video.vcxproj.filters diff --git a/Video/main.cpp b/ch04/Video/main.cpp similarity index 100% rename from Video/main.cpp rename to ch04/Video/main.cpp diff --git a/ch05/brightness/brightness.vcxproj b/ch05/brightness/brightness.vcxproj new file mode 100644 index 0000000..a685e4e --- /dev/null +++ b/ch05/brightness/brightness.vcxproj @@ -0,0 +1,142 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {a9f00664-0673-4934-b51d-a141d9c211ed} + brightness + 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/ch05/brightness/brightness.vcxproj.filters b/ch05/brightness/brightness.vcxproj.filters new file mode 100644 index 0000000..77c1a27 --- /dev/null +++ b/ch05/brightness/brightness.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/ch05/brightness/main.cpp b/ch05/brightness/main.cpp new file mode 100644 index 0000000..c7654e6 --- /dev/null +++ b/ch05/brightness/main.cpp @@ -0,0 +1,111 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +int brightness1(); +int brightness2(); +int brightness3(); +int brightness4(); +int mosaic(); + +int main() { + return brightness4(); +} + +int brightness1() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + Mat dst = src + 100; + + imshow("src", src); + imshow("dst", dst); + waitKey(); + destroyAllWindows(); + return 0; +} + +int brightness2() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + Mat dst(src.rows, src.cols, src.type()); + + for (int j = 0; j < src.rows; j++) { + for (int i = 0; i < src.cols; i++) { + dst.at(j, i) = src.at(j, i) + 100; + } + } + + imshow("src", src); + imshow("dst", dst); + waitKey(); + destroyAllWindows(); + return 0; +} + +int brightness3() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + Mat dst(src.rows, src.cols, src.type()); + + for (int j = 0; j < src.rows; j++) { + for (int i = 0; i < src.cols; i++) { + dst.at(j, i) = saturate_cast(src.at(j, i) + 100); + } + } + + imshow("src", src); + imshow("dst", dst); + waitKey(); + destroyAllWindows(); + return 0; +} + +void on_brightness(int pos, void* userdata) { + Mat src = *(Mat*)userdata; + Mat dst = src + pos; + + imshow("dst", dst); +} + +int brightness4() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + namedWindow("dst"); + createTrackbar("Brightness", "dst", 0, 100, on_brightness, (void*)&src); + + waitKey(); + destroyAllWindows(); + return 0; +} + +int mosaic() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_COLOR_RGB); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + + const + + Mat dst(src.rows, src.cols, src.type()); + + for (int j = 0; j < src.rows; j++) { + for (int i = 0; i < src.cols; i++) { + dst.at(j, i) = src.at(j, i) + 100; + } + } +} \ No newline at end of file diff --git a/ch05/contrast/contrast.vcxproj b/ch05/contrast/contrast.vcxproj new file mode 100644 index 0000000..35574d1 --- /dev/null +++ b/ch05/contrast/contrast.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {926b8522-38e8-41e3-a358-d9d628dff8a4} + contrast + 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/ch05/contrast/contrast.vcxproj.filters b/ch05/contrast/contrast.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch05/contrast/contrast.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/ch05/contrast/main.cpp b/ch05/contrast/main.cpp new file mode 100644 index 0000000..88f685a --- /dev/null +++ b/ch05/contrast/main.cpp @@ -0,0 +1,68 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +int contrast0(); +int contrast1(); +int contrast2(); + +Mat sigmoid(const Mat& input) { + Mat output; + exp(-1 * input, output); // e^(-x) + output = 1.0 / (1.0 + output); // sigmoid(x) = 1 / (1 + e^(-x)) + return output; +} + +int main() { + return contrast0(); +} + +int contrast0() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + float alpha = 1.f; + Mat dst = (sigmoid(src * alpha) * 128); + + imshow("src", src); + imshow("dst", dst); + + waitKey(); + destroyAllWindows(); +} + +int contrast1() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + float s = 2.f; + Mat dst = s * src; + + imshow("src", src); + imshow("dst", dst); + + waitKey(); + destroyAllWindows(); +} + +int contrast2() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + if (src.empty()) { + cerr << "imread()" << endl; + return 1; + } + float alpha = 1.f; + Mat dst = src + (src - 128) * alpha; + + imshow("src", src); + imshow("dst", dst); + + waitKey(); + destroyAllWindows(); +} \ No newline at end of file diff --git a/ch05/histogram/histogram.vcxproj b/ch05/histogram/histogram.vcxproj new file mode 100644 index 0000000..c85e12d --- /dev/null +++ b/ch05/histogram/histogram.vcxproj @@ -0,0 +1,145 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {d0c81788-4531-4e50-a2de-7add77039fce} + histogram + 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/ch05/histogram/histogram.vcxproj.filters b/ch05/histogram/histogram.vcxproj.filters new file mode 100644 index 0000000..bef2799 --- /dev/null +++ b/ch05/histogram/histogram.vcxproj.filters @@ -0,0 +1,32 @@ + + + + + {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/ch05/histogram/main.cpp b/ch05/histogram/main.cpp new file mode 100644 index 0000000..aeba77d --- /dev/null +++ b/ch05/histogram/main.cpp @@ -0,0 +1,81 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +Mat calcGrayHist(const Mat& img); +Mat getGrayHistImage(const Mat& hist); +Mat histogram_stretching(const Mat& src); + +int main() { + VideoCapture video; + video.open("..\\..\\resources\\images\\vtest.avi"); + int fps = video.get(CAP_PROP_FPS); + + Mat src; + + while (true) { + video >> src; + if (src.empty()) + return 1; + imshow("sample", src); + if (waitKey(1000 / fps) == 27) + break; + } + cvtColor(src, src, COLOR_BGR2GRAY); + src = src + 20; + Mat src_hist_img = getGrayHistImage(calcGrayHist(src)); + Mat dst = histogram_stretching(src); + Mat dst_hist_img = getGrayHistImage(calcGrayHist(dst)); + + imshow("src", src); + imshow("srcHist", src_hist_img); + + imshow("dst", dst); + imshow("dstHist", dst_hist_img); + + waitKey(); + destroyAllWindows(); + + return 0; +} + +Mat calcGrayHist(const Mat& img) { + CV_Assert(img.type() == CV_8UC1); + + Mat hist; + int channels[] = { 0, }; + int dims = 1; + const int histSize[] = { 256, }; + float graylevel[] = { 0, 256 }; + const float* ranges[] = { graylevel }; + + calcHist(&img, 1, channels, noArray(), hist, dims, histSize, ranges); + + return hist; +} + +Mat getGrayHistImage(const Mat& hist) { + CV_Assert(hist.type() == CV_32FC1); + CV_Assert(hist.size() == Size(1, 256)); + + double histMax; + minMaxLoc(hist, 0, &histMax); + + Mat imgHist(100, 256, CV_8UC1, Scalar(255)); + for (int i = 0; i < 256; i++) { + line(imgHist, Point(i, 100), Point(i, 100 - cvRound(hist.at(i, 0) * 100 / histMax)), Scalar(0)); + } + + return imgHist; +} + +Mat histogram_stretching(const Mat &src) { + double gmin, gmax; + minMaxLoc(src, &gmin, &gmax); + + Mat dst = (src - gmin) * 255 / (gmax - gmin); + + return dst; +} \ No newline at end of file diff --git a/ch06/Arithmetic/Arithmetic.vcxproj b/ch06/Arithmetic/Arithmetic.vcxproj new file mode 100644 index 0000000..00ea8b5 --- /dev/null +++ b/ch06/Arithmetic/Arithmetic.vcxproj @@ -0,0 +1,148 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {69a9cd92-339e-4cec-8427-3a71197437d4} + Arithmetic + 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/ch06/Arithmetic/Arithmetic.vcxproj.filters b/ch06/Arithmetic/Arithmetic.vcxproj.filters new file mode 100644 index 0000000..0503fa0 --- /dev/null +++ b/ch06/Arithmetic/Arithmetic.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {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/ch06/Arithmetic/main.cpp b/ch06/Arithmetic/main.cpp new file mode 100644 index 0000000..60b8cd9 --- /dev/null +++ b/ch06/Arithmetic/main.cpp @@ -0,0 +1,82 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +void arithmetic() { + Mat src1 = imread("..\\..\\resources\\images\\lenna256.bmp", IMREAD_GRAYSCALE); + resize(src1, src1, Size(256, 256)); + Mat src2 = imread("..\\..\\resources\\images\\square.bmp", IMREAD_GRAYSCALE); + resize(src2, src2, Size(256, 256)); + + imshow("src1", src1); + imshow("src2", src2); + + Mat dst1, dst2, dst3, dst4; + add(src1, src2, dst1); + addWeighted(src1, 0.5, src2, 0.5, 0, dst2); + subtract(src1, src2, dst3); + absdiff(src1, src2, dst4); + + imshow("dst1", dst1); + imshow("dst2", dst2); + imshow("dst3", dst3); + imshow("dst4", dst4); + waitKey(); +} + +void add() { + Mat img1 = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + resize(img1, img1, Size(256, 256)); + Mat img2 = imread("..\\..\\resources\\images\\Cameraman256.bmp", IMREAD_GRAYSCALE); + + Mat addimg; + + add(img1, img2, addimg, noArray(), -1); + + imshow("img1", img1); + imshow("img2", img2); + imshow("addimg", addimg); + + waitKey(); + destroyAllWindows(); +} + +bool equls(Mat &left, Mat &right) { + for (int i=0; i < left.cols; i++) + for (int j=0; j < left.rows; j++) + if (left.at(j, i) - right.at(j, i)) + return false; + return true; +} + +void _absdiff() { + VideoCapture video; + video.open("..\\..\\resources\\images\\vtest.avi"); + if (!video.isOpened()) + return; + Mat frame, previous_frame; + + video >> frame; + previous_frame = frame; + + double fps = video.get(CAP_PROP_FPS); + + while (!frame.empty()) { + video >> frame; + imshow("frame", frame); + Mat diff; + if (equls(previous_frame, frame)) { + absdiff(frame, previous_frame, diff); + imshow("diff", diff); + } + previous_frame = frame; + waitKey(cvRound(1000/fps)); + } +} + +int main() { + _absdiff(); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/ch06/logical/logical.vcxproj b/ch06/logical/logical.vcxproj new file mode 100644 index 0000000..772f5be --- /dev/null +++ b/ch06/logical/logical.vcxproj @@ -0,0 +1,143 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {8e7c00ae-b124-4c7e-848f-f85838afc69a} + logical + 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/ch06/logical/logical.vcxproj.filters b/ch06/logical/logical.vcxproj.filters new file mode 100644 index 0000000..69d9c27 --- /dev/null +++ b/ch06/logical/logical.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {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/ch06/logical/main.cpp b/ch06/logical/main.cpp new file mode 100644 index 0000000..c48590a --- /dev/null +++ b/ch06/logical/main.cpp @@ -0,0 +1,29 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +int main() { + Mat img1 = imread("..\\..\\resources\\images\\lenna256.bmp", IMREAD_GRAYSCALE); + resize(img1, img1, Size(256, 256)); + Mat img2 = imread("..\\..\\resources\\images\\square.bmp", IMREAD_GRAYSCALE); + + imshow("img1", img1); + imshow("img2", img2); + + Mat dst1, dst2, dst3, dst4; + + bitwise_and(img1, img2, dst1); + bitwise_or(img1, img2, dst2); + bitwise_xor(img1, img2, dst3); + bitwise_not(img1, dst4); + + imshow("dst1", dst1); + imshow("dst2", dst2); + imshow("dst3", dst3); + imshow("dst4", dst4); + waitKey(); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/ch07/blurring/blurring.vcxproj b/ch07/blurring/blurring.vcxproj new file mode 100644 index 0000000..9b11a88 --- /dev/null +++ b/ch07/blurring/blurring.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {61942c1c-14ca-49a7-b89a-4c6a8996ca6d} + blurring + 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/ch07/blurring/blurring.vcxproj.filters b/ch07/blurring/blurring.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch07/blurring/blurring.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/ch07/blurring/main.cpp b/ch07/blurring/main.cpp new file mode 100644 index 0000000..4e029e2 --- /dev/null +++ b/ch07/blurring/main.cpp @@ -0,0 +1,24 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +int main() { + Mat src = imread("..\\..\\resources\\images\\rose.bmp", IMREAD_GRAYSCALE); + + imshow("src", src); + + Mat dst; + for (int sigma = 1; sigma <= 5; sigma++) { + GaussianBlur(src, dst, Size(), (double)sigma); + + string text = format("sigma = %d", sigma); + putText(dst, text, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA); + + imshow(text, dst); + waitKey(0); + } + + destroyAllWindows(); +} \ No newline at end of file diff --git a/ch07/noise/main.cpp b/ch07/noise/main.cpp new file mode 100644 index 0000000..f7534f8 --- /dev/null +++ b/ch07/noise/main.cpp @@ -0,0 +1,52 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +void noise_gaussian() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + + imshow("src", src); + + for (int stddev = 10; stddev <= 100; stddev+=10) { + Mat noise(src.size(), CV_32SC1); + randn(noise, 0, stddev); + + Mat dst; + add(src, noise, dst, Mat(), CV_8U); + + string text = format("stddev = %d", stddev); + putText(dst, text, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA); + + imshow(text, dst); + waitKey(0); + } + destroyAllWindows(); +} + +void filter_bilateral() { + Mat src = imread("..\\..\\resources\\images\\lenna.bmp", IMREAD_GRAYSCALE); + + Mat noise(src.size(), CV_32SC1); + randn(noise, 0, 5); + add(src, noise, src, Mat(), CV_8U); + + Mat dst1; + GaussianBlur(src, dst1, Size(), 5); + + Mat dst2; + bilateralFilter(src, dst2, -1, 10, 5); + + imshow("src", src); + imshow("dst1", dst1); + imshow("dst2", dst2); + + waitKey(0); + destroyAllWindows(); +} + +int main() { + filter_bilateral(); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/ch07/noise/noise.vcxproj b/ch07/noise/noise.vcxproj new file mode 100644 index 0000000..ecbcb4e --- /dev/null +++ b/ch07/noise/noise.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {380222ef-ffe1-445f-b409-1dd866df1ed9} + noise + 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/ch07/noise/noise.vcxproj.filters b/ch07/noise/noise.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch07/noise/noise.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/ch07/sharpen/main.cpp b/ch07/sharpen/main.cpp new file mode 100644 index 0000000..abcc5a0 --- /dev/null +++ b/ch07/sharpen/main.cpp @@ -0,0 +1,31 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +void unsharp_mask() { + Mat src = imread("..\\..\\resources\\images\\rose.bmp", IMREAD_GRAYSCALE); + + imshow("src", src); + + for (int sigma = 1; sigma <= 5; sigma++) { + Mat blurred; + GaussianBlur(src, blurred, Size(), (double)sigma); + + constexpr float alpha = 1.f; + Mat dst = (1 + alpha) * src - alpha * blurred; + + string text = format("sigma = %d", sigma); + putText(dst, text, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA); + + imshow(text, dst); + waitKey(0); + } + destroyAllWindows(); +} + +int main() { + unsharp_mask(); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/ch07/sharpen/sharpen.vcxproj b/ch07/sharpen/sharpen.vcxproj new file mode 100644 index 0000000..0022dfc --- /dev/null +++ b/ch07/sharpen/sharpen.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {a871f9d8-2dd0-4b01-a304-e738968313f2} + sharpen + 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/ch07/sharpen/sharpen.vcxproj.filters b/ch07/sharpen/sharpen.vcxproj.filters new file mode 100644 index 0000000..2c1b3dc --- /dev/null +++ b/ch07/sharpen/sharpen.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/cn06/filter/filter.vcxproj b/cn06/filter/filter.vcxproj new file mode 100644 index 0000000..aa01c93 --- /dev/null +++ b/cn06/filter/filter.vcxproj @@ -0,0 +1,142 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {8219467f-93df-4080-8452-97e1ec422d8b} + filter + 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/cn06/filter/filter.vcxproj.filters b/cn06/filter/filter.vcxproj.filters new file mode 100644 index 0000000..dfacd42 --- /dev/null +++ b/cn06/filter/filter.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/cn06/filter/main.cpp b/cn06/filter/main.cpp new file mode 100644 index 0000000..fe0b9fb --- /dev/null +++ b/cn06/filter/main.cpp @@ -0,0 +1,76 @@ +#include +#include "opencv2/opencv.hpp" + +using namespace std; +using namespace cv; + +void filter_embossing() { + Mat src = imread("..\\..\\resources\\images\\rose.bmp", IMREAD_GRAYSCALE); + + float filter1[] = + { -1, -1, 0, -1, 0, 1, 0, 1, 1 }; + float filter2[] = + { -1, -1, -1, -1, 0, + -1, -1, -1, 0, 1, + -1, -1, 0, 1, 1, + -1, 0, 1, 1, 1, + 0, 1, 1, 1, 1, }; + float filter3[] = + { + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1, + -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, 1 + }; + float filter4[] = + { + -1, -1, -1, 0, 1, 1, 1, + -1, -1, -1, 0, 1, 1, 1, + -1, -1, -1, 0, 1, 1, 1, + -1, -1, -1, 0, 1, 1, 1, + -1, -1, -1, 0, 1, 1, 1, + -1, -1, -1, 0, 1, 1, 1, + -1, -1, -1, 0, 1, 1, 1 + }; + Mat emboss(7, 7, CV_32FC1, filter4); + Mat dst; + + filter2D(src, dst, -1, emboss, Point(-1, -1), 128); + + imshow("src", src); + imshow("dst", dst); + + waitKey(0); + destroyAllWindows(); +} + +void blurring_mean() { + Mat src = imread("..\\..\\resources\\images\\rose.bmp", IMREAD_GRAYSCALE); + + imshow("src", src); + + Mat dst; + for (int ksize = 3; ksize <= 7; ksize += 2) { + blur(src, dst, Size(ksize, ksize)); + + String desc = format("Mean: %dx%d", ksize, ksize); + putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA); + + imshow(desc, dst); + waitKey(0); + } + destroyAllWindows(); +} + +int main() { + filter_embossing(); +} \ No newline at end of file