Skip to content

Commit

Permalink
1. fastDonut 업데이트
Browse files Browse the repository at this point in the history
  • Loading branch information
gellston committed Jan 21, 2022
1 parent 11609a1 commit 46087bd
Show file tree
Hide file tree
Showing 20 changed files with 396 additions and 11 deletions.
37 changes: 37 additions & 0 deletions FastROI/ConsoleApplication2/ConsoleApplication2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// ConsoleExample.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

#include <iostream>
#include <opencv2/opencv.hpp>
#include <ctime>
#include <chrono>

#include "fastDonut.h"



int main()
{

cv::namedWindow("result", cv::WINDOW_NORMAL);

cv::Mat result(cv::Size(4000, 4000), CV_8UC3);

while (true) {

auto vertical_lines = fast::fastDonut(2000, 2000, 1000, 1, 0.5, 1);

result = cv::Scalar(0, 0, 0);
for (auto& vertical_line : vertical_lines) {
for (auto& calPoint : vertical_line) {
if (calPoint.x < 0 || calPoint.x >= 4000 || calPoint.y < 0 || calPoint.y >= 4000)
continue;

cv::circle(result, cv::Point((int)calPoint.x, (int)calPoint.y), 2, cv::Scalar(0, 255, 0), -1);
}
}
cv::imshow("result", result);
if (cv::waitKey(1) == 27)break;
}
}

155 changes: 155 additions & 0 deletions FastROI/ConsoleApplication2/ConsoleApplication2.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{5e63e966-9b2e-4bb0-90d8-8b3e9bb9fdb9}</ProjectGuid>
<RootNamespace>ConsoleApplication2</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>$(SolutionDir)fastROI\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>fastROI.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>$(SolutionDir)fastROI\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>fastROI.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="ConsoleApplication2.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
22 changes: 22 additions & 0 deletions FastROI/ConsoleApplication2/ConsoleApplication2.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="소스 파일">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="헤더 파일">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="리소스 파일">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="ConsoleApplication2.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
</ItemGroup>
</Project>
4 changes: 4 additions & 0 deletions FastROI/ConsoleApplication2/ConsoleApplication2.vcxproj.user
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
9 changes: 4 additions & 5 deletions FastROI/ConsoleExample/ConsoleExample1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ int main()
std::chrono::high_resolution_clock::time_point _start;

_start = std::chrono::high_resolution_clock::now();
int count = 0;
int count = 0;
while (true) {

result = cv::Scalar(0, 0, 0);



std::vector<std::vector<fast::calPoint>> vertical_lines = fast::rectROI(2000, 2000, angle, 1000, 1000, false, 50);

for (auto vertical_line : vertical_lines) {
for (auto calPoint : vertical_line) {
if (calPoint.x < 0 || calPoint.x >= 4000 || calPoint.y < 0 || calPoint.y >= 4000)
Expand All @@ -42,4 +42,3 @@ int main()
if (angle++ > 360) angle = 0;
}
}

15 changes: 14 additions & 1 deletion FastROI/FastROI.sln
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@ VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fastROI", "fastROI\fastROI.vcxproj", "{8F4B183C-08FD-43B7-ADD3-98F7D7635DA0}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleExample", "ConsoleExample\ConsoleExample.vcxproj", "{EBCC182D-B2EF-46D9-B74F-92533CB680C3}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleExample1", "ConsoleExample\ConsoleExample.vcxproj", "{EBCC182D-B2EF-46D9-B74F-92533CB680C3}"
ProjectSection(ProjectDependencies) = postProject
{8F4B183C-08FD-43B7-ADD3-98F7D7635DA0} = {8F4B183C-08FD-43B7-ADD3-98F7D7635DA0}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleApplication2", "ConsoleApplication2\ConsoleApplication2.vcxproj", "{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}"
ProjectSection(ProjectDependencies) = postProject
{8F4B183C-08FD-43B7-ADD3-98F7D7635DA0} = {8F4B183C-08FD-43B7-ADD3-98F7D7635DA0}
EndProjectSection
Expand Down Expand Up @@ -34,6 +39,14 @@ Global
{EBCC182D-B2EF-46D9-B74F-92533CB680C3}.Release|x64.Build.0 = Release|x64
{EBCC182D-B2EF-46D9-B74F-92533CB680C3}.Release|x86.ActiveCfg = Release|Win32
{EBCC182D-B2EF-46D9-B74F-92533CB680C3}.Release|x86.Build.0 = Release|Win32
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Debug|x64.ActiveCfg = Debug|x64
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Debug|x64.Build.0 = Debug|x64
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Debug|x86.ActiveCfg = Debug|Win32
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Debug|x86.Build.0 = Debug|Win32
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Release|x64.ActiveCfg = Release|x64
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Release|x64.Build.0 = Release|x64
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Release|x86.ActiveCfg = Release|Win32
{5E63E966-9B2E-4BB0-90D8-8B3E9BB9FDB9}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
1 change: 1 addition & 0 deletions FastROI/fastROI/compile.cpp
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
#include "fastRect.h"
#include "fastDonut.h"
94 changes: 94 additions & 0 deletions FastROI/fastROI/fastDonut.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#define _USE_MATH_DEFINES

#include "fastDonut.h"

#include <Eigen/Core>
#include <Eigen/Dense>




std::vector<std::vector<fast::calPoint>> fast::fastDonut(int center_x, int center_y, int radius, double start_ratio, double end_ratio, double step_angle) {

if (radius == 0) {
HVERROR(error, "Invalid box roi range");
}

if (step_angle <= 0) {
HVERROR(error, "Invalid step angle");
}

if (start_ratio <= 0 && end_ratio <= 0) {
HVERROR(error, "Invalid ratio");
}



int start_radius = (int)((double)radius * start_ratio);
int end_radius = (int)((double)radius * end_ratio);

int distance_radius = (int)fabs(start_radius - end_radius);
if (distance_radius == 0) {
HVERROR(error, "Invalid start ratio and end ratio");
}

int aligned_distance_radius = distance_radius + (distance_radius % 4);
int min_radius = start_radius > end_radius ? end_radius : start_radius;
int max_radius = start_radius > end_radius ? start_radius : end_radius;


/// Radius SIMD
std::vector<double> vector_radius; // Radius vector
vector_radius.resize(aligned_distance_radius * 2);


int sign = 1;
if (start_radius > end_radius)
sign = -1;

int current_radius = start_radius;
for (int radius = 0; radius < distance_radius * 2;) {
vector_radius[radius] = current_radius;
vector_radius[radius + 1] = current_radius;
radius += 2;
current_radius += sign;
}

/// Coordinate SIMD
std::vector<double> vector_cordinate_table = { (double)center_x , (double)center_y, (double)center_x , (double)center_y }; // cordinate vector
const __m256d simd_coordinate = _mm256_load_pd(vector_cordinate_table.data()); // cordinate simd



std::vector<std::vector<fast::calPoint>> combine_vertical_xy;
int doubleDistance = distance_radius * 2;
int chunk_size = sizeof(double) * 4;

for (double angle = 0; angle < 360;) {

/// trigonometric SIMD
double x_cos = sin(angle * M_PI / 180);
double y_sine = cos(angle * M_PI / 180);
std::vector<double> vector_trigonometric_table = { x_cos ,y_sine, x_cos ,y_sine }; // trigonometric vector
const __m256d simd_trigonometric = _mm256_load_pd(vector_trigonometric_table.data()); // trigonometric simd


std::vector<fast::calPoint> vertical_xy;
vertical_xy.resize(aligned_distance_radius);
void* vertical_xy_ptr = vertical_xy.data();
for (int simd_skip = 0; simd_skip < doubleDistance;) {

const __m256d simd_radius = _mm256_load_pd(vector_radius.data() + simd_skip); // radius simd
__m256d chunk_mul = _mm256_mul_pd(simd_radius, simd_trigonometric);
__m256d start_result = _mm256_add_pd(chunk_mul, simd_coordinate);
memcpy((((double*)vertical_xy_ptr) + simd_skip), &start_result, chunk_size);
simd_skip += 4;
}
vertical_xy.resize(distance_radius);
combine_vertical_xy.push_back(vertical_xy);

angle += step_angle;
}

return combine_vertical_xy;
}
19 changes: 19 additions & 0 deletions FastROI/fastROI/fastDonut.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#ifndef FAST_DOUNUT
#define FAST_DOUNUT

#include <vector>
#include <memory>

#include "macro.h"
#include "calPoint.h"

namespace fast {
FAST_API_EXPORT std::vector<std::vector<fast::calPoint>> fastDonut(int center_x, int center_y, int radius, double start_ratio, double end_ratio, double step_angle);
}




#endif
Loading

0 comments on commit 46087bd

Please sign in to comment.