Updated Moore algorithm

This commit is contained in:
2017-11-22 14:57:42 +01:00
parent 89bdd830a2
commit f59e576758
3 changed files with 76 additions and 28 deletions
+13 -13
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
@@ -89,13 +89,13 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>C:\opencv\build\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>C:\opencv\build\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalIncludeDirectories>D:\Code\OpenCV\install\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>D:\Code\OpenCV\install\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\opencv\build\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>D:\Code\OpenCV\install\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opencv_world330.lib;opencv_world330d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
@@ -106,13 +106,13 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>C:\opencv\build\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>C:\opencv\build\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalIncludeDirectories>D:\Code\OpenCV\install\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>D:\Code\OpenCV\install\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\opencv\build\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>D:\Code\OpenCV\install\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opencv_world330.lib;opencv_world330d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
@@ -125,8 +125,8 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>C:\opencv\build\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>C:\opencv\build\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalIncludeDirectories>D:\Code\OpenCV\install\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>D:\Code\OpenCV\install\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -134,7 +134,7 @@
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencv_world330.lib;opencv_world330d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\opencv\build\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>D:\Code\OpenCV\install\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -146,8 +146,8 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>C:\opencv\build\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>C:\opencv\build\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalIncludeDirectories>D:\Code\OpenCV\install\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalUsingDirectories>D:\Code\OpenCV\install\include;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -155,7 +155,7 @@
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencv_world330.lib;opencv_world330d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\opencv\build\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>D:\Code\OpenCV\install\x64\vc14\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
@@ -2,6 +2,7 @@
#include "avansvisionlib.h"
#include <set>
//direction values
// starting at position 0. Definition of relative positions:
// 7 0 1
@@ -10,6 +11,16 @@
int rotateX[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int rotateY[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
struct pointCompare
{
bool operator() (const Point &a, const Point &b)
{
if (a.x < b.x)
return true;
return a.y < b.y;
}
};
int allContours(Mat binaryImage, vector<vector<Point>>& contourVecVec)
{
Mat labeledImage;
@@ -22,19 +33,19 @@ int allContours(Mat binaryImage, vector<vector<Point>>& contourVecVec)
Point b0, b1, c0, c1, firstb0, firstb1;
for (Point2d *ptr : firstPixelVec2) {
set<Point> contourVec;
vector<Point> contourVec;
firstb0 = Point((int)ptr->x, (int)ptr->y);
b0 = Point((int)ptr->x, (int)ptr->y);
c0 = Point((int)(ptr->x - 1), (int)ptr->y);
firstb0 = Point((int)ptr->y, (int)ptr->x);
b0 = Point((int)ptr->y, (int)ptr->x);
c0 = Point((int)(ptr->y - 1), (int)ptr->x);
int firstDirection = discoverNext(binaryImage, b0, 6);
b1 = getDirPos(b0, firstDirection);
firstb1 = b1;
firstb1 = getDirPos(b0, firstDirection);
c1 = getDirPos(b0, (firstDirection + 7) % 8);
contourVec.insert(b0);
contourVec.insert(b1);
contourVec.push_back(b0);
contourVec.push_back(b1);
do {
@@ -42,24 +53,32 @@ int allContours(Mat binaryImage, vector<vector<Point>>& contourVecVec)
c0 = c1;
int dir = discoverNext(binaryImage, b0, discoverNextRelativeDirection(b0, c0));
if (dir < 0)
{
cout << "Het gaat eventjes niet goed hoor: " << b0 << " - " << c0 << endl;
}
b1 = getDirPos(b0, dir);
c1 = getDirPos(b0, (dir + 7) % 8);
contourVec.insert(b1);
if(!contains(contourVec, b1))
contourVec.push_back(b1);
} while (b0 == firstb0 && b1 == firstb1);
} while (b0 != firstb0 && b1 != firstb1);
std::vector<Point> output;
std::copy(contourVec.begin(), contourVec.end(), output.begin());
contourVecVec.push_back(output);
contourVecVec.push_back(contourVec);
}
flip(contourVecVec);
return numberOfBlobs; //number of objects
}
int discoverNext(Mat &binaryImage, cv::Point pos, int beginDirection)
{
if (beginDirection > 8) {
if (beginDirection < 0 || beginDirection > 8) {
cout << "Begin direction is invalid : " << beginDirection << endl;
return -1;
}
for (int i = 0; i < 8; i++) {
@@ -68,7 +87,7 @@ int discoverNext(Mat &binaryImage, cv::Point pos, int beginDirection)
int newX = pos.x + rotateX[dir];
int newY = pos.y + rotateY[dir];
if (getEntry(binaryImage, newX, newY) == 1) {
if (getEntryImage(binaryImage, newX, newY) == 1) {
return dir;
}
}
@@ -99,3 +118,29 @@ cv::Point getDirPos(cv::Point pos, int dir)
return cv::Point(x, y);
}
bool contains(vector<Point> vec, Point p)
{
for (Point pnt : vec)
{
if (pnt.x == p.x && pnt.y == p.y)
return true;
}
return false;
}
void flip(vector<vector<Point>> &vec)
{
for (vector<Point> &pvec : vec)
{
for (Point &p : pvec)
{
int x = p.x;
int y = p.y;
p.x = y;
p.y = x;
}
}
}
@@ -23,4 +23,7 @@ int discoverNextRelativeDirection(cv::Point pos, cv::Point target);
// func: get a point with a given position and direction
// return_value : new point
cv::Point getDirPos(cv::Point pos, int dir);
cv::Point getDirPos(cv::Point pos, int dir);
bool contains(vector<Point> vec, Point p);
void flip(vector<vector<Point>> &vec);