Updated Moore algorithm
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user