From 88c0a3e253585bc3248fe863e27dd134d4edf679 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 24 Nov 2017 14:15:30 +0100 Subject: [PATCH] Working algorithm --- .../MooreBoundaryTrackingAlgorithm.cpp | 87 ++++++++---------- .../MooreBoundaryTrackingAlgorithm.h | 10 +- AdvancedVision/allContoursTestprogramma.cpp | 11 +++ AdvancedVision/input/Week 2/monsters.jpg | Bin 14508 -> 22187 bytes 4 files changed, 56 insertions(+), 52 deletions(-) diff --git a/AdvancedVision/MooreBoundaryTrackingAlgorithm.cpp b/AdvancedVision/MooreBoundaryTrackingAlgorithm.cpp index ff2cab6..d3847f1 100644 --- a/AdvancedVision/MooreBoundaryTrackingAlgorithm.cpp +++ b/AdvancedVision/MooreBoundaryTrackingAlgorithm.cpp @@ -1,7 +1,5 @@ #include "MooreBoundaryTrackingAlgorithm.h" #include "avansvisionlib.h" -#include - //direction values // starting at position 0. Definition of relative positions: @@ -11,44 +9,24 @@ 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>& contourVecVec) { + Mat labeledImage; + vector firstPixelVec2; + vector posVec2; + vector areaVec2; + int numberOfBlobs = labelBLOBsInfo(binaryImage, labeledImage, firstPixelVec2, posVec2, areaVec2); Point b0, b1, c0, c1, firstb0, firstb1; - for (int y = 0; y < binaryImage.rows; y++) { - for (int x = 0; x < binaryImage.cols; x++) - { - Point p = Point(x, y); + for (Point2d *ptr : firstPixelVec2) { + vector contourVec; - if (getEntryImage(binaryImage, y, x) != 1) - { - continue; - } + 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); - if (isInsideContours(contourVecVec, p)) - { - continue; - } - - - vector contourVec; - - firstb0 = p; - b0 = p; - c0 = Point(x - 1, y); - - int firstDirection = discoverNext(binaryImage, b0, discoverNextRelativeDirection(b0, c0)); + int firstDirection = discoverNext(binaryImage, b0, 6); b1 = getDirPos(b0, firstDirection); firstb1 = getDirPos(b0, firstDirection); c1 = getDirPos(b0, (firstDirection + 7) % 8); @@ -58,15 +36,14 @@ int allContours(Mat binaryImage, vector>& contourVecVec) do { - b0 = b1; - c0 = c1; + b0 = Point(b1.x, b1.y); + c0 = Point(c1.x, c1.y); - int cdir = discoverNextRelativeDirection(b0, c0); - int dir = discoverNext(binaryImage, b0, cdir); + int dir = discoverNext(binaryImage, b0, discoverNextRelativeDirection(b0, c0)); if (dir < 0) { - cout << "Het gaat eventjes niet goed hoor: " << cdir << " : " << b0 << " - " << c0 << endl; + cout << "Er is niks aan de hand! " << " : " << b0 << " - " << c0 << endl; } b1 = getDirPos(b0, dir); @@ -78,17 +55,18 @@ int allContours(Mat binaryImage, vector>& contourVecVec) } while (b0 != firstb0 && b1 != firstb1); - if(contourVec.size() > 5) + cout << "Klaar met het vinden van contouren" << endl; + + if(contourVec.size() > 4) contourVecVec.push_back(contourVec); - } } - flip(contourVecVec); + //flip(contourVecVec); - return contourVecVec.size(); //number of objects + return numberOfBlobs; //number of objects } -int discoverNext(Mat &binaryImage, cv::Point pos, int beginDirection) +int discoverNext(Mat &binaryImage, const cv::Point &pos, int beginDirection) { if (beginDirection < 0 || beginDirection > 8) { cout << "Begin direction is invalid : " << beginDirection << endl; @@ -100,7 +78,7 @@ int discoverNext(Mat &binaryImage, cv::Point pos, int beginDirection) int newX = pos.x + rotateX[dir]; int newY = pos.y + rotateY[dir]; - if (getEntryImage(binaryImage, newX, newY) == 1) { + if (getEntryImage(binaryImage, newY, newX) == 1) { return dir; } } @@ -108,7 +86,7 @@ int discoverNext(Mat &binaryImage, cv::Point pos, int beginDirection) return -1; } -int discoverNextRelativeDirection(cv::Point pos, cv::Point target) +int discoverNextRelativeDirection(const cv::Point &pos, const cv::Point &target) { for (int i = 0; i < 8; i++) { int dir = i; @@ -123,7 +101,7 @@ int discoverNextRelativeDirection(cv::Point pos, cv::Point target) return -1; } -cv::Point getDirPos(cv::Point pos, int dir) +cv::Point getDirPos(const cv::Point &pos, int dir) { int x, y; x = pos.x + rotateX[dir]; @@ -169,6 +147,19 @@ bool isInsideContours(vector>& vec, Point point) } return false; +} - -} \ No newline at end of file +double getBendingEnergy(const vector& contour) +{ + double energy = 0; + + Point previousPoint = contour[contour.size() - 1]; + + for (Point p : contour) + { + energy += discoverNextRelativeDirection(previousPoint, p); + previousPoint = p; + } + + return energy; +} diff --git a/AdvancedVision/MooreBoundaryTrackingAlgorithm.h b/AdvancedVision/MooreBoundaryTrackingAlgorithm.h index 2b9e380..966e153 100644 --- a/AdvancedVision/MooreBoundaryTrackingAlgorithm.h +++ b/AdvancedVision/MooreBoundaryTrackingAlgorithm.h @@ -17,16 +17,18 @@ int allContours(Mat binaryImage, vector> &contourVecVec); // func: discover next b // return_value: new direction -int discoverNext(Mat &binaryImage, cv::Point pos, int beginDirection); +int discoverNext(Mat &binaryImage, const cv::Point &pos, int beginDirection); // func: discover next c // return_value : new direction -int discoverNextRelativeDirection(cv::Point pos, cv::Point target); +int discoverNextRelativeDirection(const cv::Point &pos, const 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(const cv::Point &pos, int dir); bool contains(vector vec, Point p); void flip(vector> &vec); -bool isInsideContours(vector>& vec, Point point); \ No newline at end of file +bool isInsideContours(vector>& vec, Point point); + +double getBendingEnergy(const vector &contour); \ No newline at end of file diff --git a/AdvancedVision/allContoursTestprogramma.cpp b/AdvancedVision/allContoursTestprogramma.cpp index 0eefd3d..acf9667 100644 --- a/AdvancedVision/allContoursTestprogramma.cpp +++ b/AdvancedVision/allContoursTestprogramma.cpp @@ -101,6 +101,17 @@ int main(int argc, char *argv[]) imshow("Found contours", contourImage); waitKey(0); + //haal bending energy waarde op + + + cout << "Bending Energy" << endl << "-----------" << endl; + + for (int i = 0; i < contours.size(); i++) + { + cout << "[" << i << "] " << getBendingEnergy(contours[i]) << endl; + } + + string pipo; cin >> pipo; diff --git a/AdvancedVision/input/Week 2/monsters.jpg b/AdvancedVision/input/Week 2/monsters.jpg index 3013a3f5669ca72d20841adba062fec7cedff690..7655643adc979ac9c4f3d9c94212bad99625fa67 100644 GIT binary patch literal 22187 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 G@V@{W>XG9B