diff --git a/.gitignore b/.gitignore index 259148f..3e759b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,330 @@ -# Prerequisites -*.d +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore -# Compiled Object files -*.slo -*.lo -*.o -*.obj +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c -# Precompiled Headers -*.gch +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj *.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app +# MFractors (Xamarin productivity tool) working folder +.mfractor/ diff --git a/1706-4/dobrohotov_vn/Lab 1/Image/big.jpg b/1706-4/dobrohotov_vn/Lab 1/Image/big.jpg new file mode 100644 index 0000000..f4e7008 Binary files /dev/null and b/1706-4/dobrohotov_vn/Lab 1/Image/big.jpg differ diff --git a/1706-4/dobrohotov_vn/Lab 1/Image/big_bus.jpg b/1706-4/dobrohotov_vn/Lab 1/Image/big_bus.jpg new file mode 100644 index 0000000..e0510ea Binary files /dev/null and b/1706-4/dobrohotov_vn/Lab 1/Image/big_bus.jpg differ diff --git a/1706-4/dobrohotov_vn/Lab 1/Image/qwe.png b/1706-4/dobrohotov_vn/Lab 1/Image/qwe.png new file mode 100644 index 0000000..0f2cc80 Binary files /dev/null and b/1706-4/dobrohotov_vn/Lab 1/Image/qwe.png differ diff --git a/1706-4/dobrohotov_vn/Lab 1/Image/test.png b/1706-4/dobrohotov_vn/Lab 1/Image/test.png new file mode 100644 index 0000000..e96cf16 Binary files /dev/null and b/1706-4/dobrohotov_vn/Lab 1/Image/test.png differ diff --git a/1706-4/dobrohotov_vn/Lab 1/Image/test1.jpg b/1706-4/dobrohotov_vn/Lab 1/Image/test1.jpg new file mode 100644 index 0000000..dd49b65 Binary files /dev/null and b/1706-4/dobrohotov_vn/Lab 1/Image/test1.jpg differ diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1.sln b/1706-4/dobrohotov_vn/Lab 1/Lab 1.sln new file mode 100644 index 0000000..6fbdd17 --- /dev/null +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.852 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Lab 1", "Lab 1\Lab 1.vcxproj", "{C65582B0-F46D-4393-BAC1-1A482DE700A0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Debug|x64.ActiveCfg = Debug|x64 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Debug|x64.Build.0 = Debug|x64 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Debug|x86.ActiveCfg = Debug|Win32 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Debug|x86.Build.0 = Debug|Win32 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Release|x64.ActiveCfg = Release|x64 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Release|x64.Build.0 = Release|x64 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Release|x86.ActiveCfg = Release|Win32 + {C65582B0-F46D-4393-BAC1-1A482DE700A0}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {43D568AE-5142-425C-AAFF-6746EDFE149D} + EndGlobalSection +EndGlobal diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj new file mode 100644 index 0000000..6a3bfcc --- /dev/null +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj @@ -0,0 +1,133 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {C65582B0-F46D-4393-BAC1-1A482DE700A0} + Lab1 + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + D:\opencv\build\include;D:\tbb\include;%(AdditionalIncludeDirectories) + + + D:\opencv\build\x64\vc15\lib;D:\tbb\lib\intel64\vc14;%(AdditionalLibraryDirectories) + opencv_world420d.lib;tbb_debug.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + D:\opencv\build\include;D:\tbb\include;%(AdditionalIncludeDirectories) + true + + + true + true + D:\opencv\build\x64\vc15\lib;D:\tbb\lib\intel64\vc14;%(AdditionalLibraryDirectories) + opencv_world420.lib;tbb.lib;%(AdditionalDependencies) + Console + + + + + + + + + \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters new file mode 100644 index 0000000..41d453a --- /dev/null +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Lab 1.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;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 + + + + + Source Files + + + \ No newline at end of file diff --git a/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp new file mode 100644 index 0000000..7d5ca87 --- /dev/null +++ b/1706-4/dobrohotov_vn/Lab 1/Lab 1/Source.cpp @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define PI 3.14159265358979323846 + +double* createKernel(const double sigma) +{ + double *kernel = new double[9]; + double sum = 0; + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + kernel[i + j + 2 * (i + 2)] = (exp(-(i * i + j * j) / (2 * sigma * sigma))) / (2 * PI*sigma*sigma); + sum += kernel[i + j + 2 * (i + 2)]; + } + } + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + kernel[i + j + 2 * (i + 2)] /= sum; + } + } + return kernel; +} + +void printKernel(const double* const kernel) +{ + for (int i = -1; i <= 1; ++i) + { + for (int j = -1; j <= 1; ++j) + std::cout << kernel[i + j + 2 * (i + 2)] << " "; + std::cout << std::endl; + } +} + +int Clamp(const int num) +{ + if (num > 255) + return 255; + else if (num < 0) + return 0; + return num; + +} + +cv::Mat duplicateBorder(const cv::Mat& image) +{ + cv::Mat new_image(image.rows + 2, image.cols + 2, CV_8UC1); + new_image.at(0, 0) = image.at(0, 0); + new_image.at(0, new_image.cols - 1) = image.at(0, image.cols - 1); + new_image.at(new_image.rows - 1, 0) = image.at(image.rows - 1, 0); + new_image.at(new_image.rows - 1, new_image.cols - 1) = image.at(image.rows - 1, image.cols - 1); + for (int i = 0; i < image.cols; i++) { + new_image.at(0, i + 1) = image.at(0, i); + new_image.at(new_image.rows - 1, i + 1) = image.at(image.rows - 1, i); + } + for (int i = 0; i < image.rows; i++) { + new_image.at(i + 1, 0) = image.at(i, 0); + new_image.at(i + 1, new_image.cols - 1) = image.at(i, image.cols - 1); + } + image.copyTo(new_image(cv::Rect(1, 1, image.cols, image.rows))); + return new_image; +} + +cv::Mat gaussSeq(const cv::Mat& image, const double*const kernel) +{ + cv::Mat filter = cv::Mat::zeros(image.rows - 2, image.cols - 2, CV_8UC1); + for (int y = 1; y < image.rows - 1; ++y) + for (int x = 1; x < image.cols - 1; ++x) + { + double tmp = 0; + for (int i = -1; i <= 1; ++i) + for (int j = -1; j <= 1; j++) + { + tmp += image.at(y + i, x + j) * kernel[i + j + 2 * (i + 2)]; + } + filter.at(y - 1, x - 1) = Clamp(static_cast(tmp)); + } + return filter; +} + +cv::Mat gaussOpenMP(const cv::Mat& image, const double*const kernel, int count_threads) +{ + cv::Mat filter = cv::Mat::zeros(image.rows - 2, image.cols - 2, CV_8UC1); + omp_set_num_threads(count_threads); +#pragma omp parallel + { +#pragma omp for schedule(dynamic) + for (int x = 1; x < image.cols - 1; ++x) + { + for (int y = 1; y < image.rows - 1; ++y) + { + double tmp = 0; + for (int i = -1; i <= 1; ++i) + for (int j = -1; j <= 1; j++) + { + tmp += image.at(y + i, x + j) * kernel[i + j + 2 * (i + 2)]; + } + filter.at(y - 1, x - 1) = Clamp(static_cast(tmp)); + } + } + } + return filter; +} + +void funcForTBB(const cv::Mat& src, cv::Mat& dst,const double * const kernel, size_t number_col) +{ + for (int y = 1; y < src.rows - 1; ++y) + { + double tmp = 0; + for (int i = -1; i <= 1; ++i) + for (int j = -1; j <= 1; ++j) + { + tmp += src.at(y + i, number_col + j) * kernel[i + j + 2 * (i + 2)]; + } + dst.at(y - 1, number_col - 1) = Clamp(static_cast(tmp)); + } +} + +cv::Mat gaussTBB(const cv::Mat& image, const double* kernel, const int count_threads) +{ + tbb::task_scheduler_init init(count_threads); + cv::Mat filter = cv::Mat::zeros(image.rows - 2, image.cols - 2, CV_8UC1); + tbb::parallel_for(tbb::blocked_range(1, image.cols-1), [&image, &filter, &kernel](const tbb::blocked_range& r) + { + for (size_t i = r.begin(); i != r.end(); ++i) + { + funcForTBB(image, filter, kernel, i); + } + }); + return filter; +} + + +bool checkImages(const cv::Mat& image1, const cv::Mat& image2) +{ + cv::Mat res; + cv::bitwise_xor(image1, image2, res); //2 equal pixel = 0, 2 different pixel = pixel + if (cv::countNonZero(res) > 0) + return false; + else + return true; +} + +int main(int argc, char** argv) +{ + std::string path_to_image; + cv::Mat original, duplicate; + int count_threads; + double* kernel; + if (argc < 2) + path_to_image += "../Image/big.jpg"; + else + path_to_image += argv[1]; + original = cv::imread(path_to_image); + if (original.empty()) { + std::cout << "Error load image" << std::endl; + return -1; + } + if (argc < 3) + { + count_threads = tbb::task_scheduler_init::default_num_threads(); + } + else + { + count_threads = atoi(argv[2]); + if (count_threads == 0) + { + std::cout << "Error input num threads" << std::endl; + return -2; + } + } + if (original.channels() > 1) { + cv::cvtColor(original, original, cv::COLOR_BGR2GRAY); + std::cout << "image to grey color" << std::endl; + } + duplicate = duplicateBorder(original); + kernel = createKernel(0.85); + + //Linear algorithm + cv::Mat filter_seq; + tbb::tick_count start_seq = tbb::tick_count::now(); + filter_seq = gaussSeq(duplicate, kernel); + tbb::tick_count finish_seq = tbb::tick_count::now(); + + //OpenMP + cv::Mat filter_openMP; + tbb::tick_count start_openMP = tbb::tick_count::now(); + filter_openMP = gaussOpenMP(duplicate, kernel, count_threads); + tbb::tick_count finish_openMP = tbb::tick_count::now(); + + //TBB + cv::Mat filter_TBB; + tbb::tick_count start_TBB = tbb::tick_count::now(); + filter_TBB = gaussTBB(duplicate, kernel, count_threads); + tbb::tick_count finish_TBB = tbb::tick_count::now(); + + std::cout << "Threads: " << count_threads << std::endl; + std::cout << "Check algorithms openMP: " << checkImages(filter_seq, filter_openMP) << std::endl; + std::cout << "Check algorithms TBB: " << checkImages(filter_seq, filter_TBB) << std::endl; + std::cout << "Time seq: " << (finish_seq - start_seq).seconds() << std::endl; + std::cout << "Time openMP: " << (finish_openMP - start_openMP).seconds() << std::endl; + std::cout << "Time TBB: " << (finish_TBB - start_TBB).seconds() << std::endl; + cv::namedWindow("Original", cv::WINDOW_NORMAL); + cv::namedWindow("Filter", cv::WINDOW_NORMAL); + cv::imshow("Original", original); + cv::imshow("Filter", filter_openMP); + cv::waitKey(); + return 0; +}