Niet werkende commit
@@ -0,0 +1,89 @@
|
|||||||
|
#include "BoundingBox.h"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
|
BoundingBox::BoundingBox()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BoundingBox::~BoundingBox()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// func: delivers bounding Boxes of contours
|
||||||
|
// pre: contours contains the contours for which bounding boxes have to be delivered
|
||||||
|
// post: bbs contains all bounding boxes. The index corresponds to the index of contours.
|
||||||
|
// I.e. bbs[i] belongs to contours[i]
|
||||||
|
int BoundingBox::allBoundingBoxes(const vector<vector<Point>> & contours, vector<vector<Point>> & bbs)
|
||||||
|
{
|
||||||
|
for (vector<Point> contour : contours)
|
||||||
|
{
|
||||||
|
int maxx = INT_MIN, maxy = INT_MIN, minx = INT_MAX, miny = INT_MAX;
|
||||||
|
|
||||||
|
for (Point p : contour)
|
||||||
|
{
|
||||||
|
if (p.x > maxx)
|
||||||
|
maxx = p.x;
|
||||||
|
|
||||||
|
if (p.y > maxy)
|
||||||
|
maxy = p.y;
|
||||||
|
|
||||||
|
if (p.x < minx)
|
||||||
|
minx = p.x;
|
||||||
|
|
||||||
|
if (p.y < miny)
|
||||||
|
miny = p.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<Point> bounding;
|
||||||
|
bounding.push_back(Point(minx, miny));
|
||||||
|
bounding.push_back(Point(maxx, miny));
|
||||||
|
bounding.push_back(Point(maxx, maxy));
|
||||||
|
bounding.push_back(Point(minx, maxy));
|
||||||
|
bbs.push_back(bounding);
|
||||||
|
}
|
||||||
|
|
||||||
|
return contours.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int BoundingBox::split(const vector<vector<Point>> & contours, const Mat &image, string filename)
|
||||||
|
{
|
||||||
|
//Create filenames
|
||||||
|
std::string base_filename = filename.substr(filename.find_last_of("/\\") + 1);
|
||||||
|
std::string::size_type const p(base_filename.find_last_of('.'));
|
||||||
|
std::string name = base_filename.substr(0, p);
|
||||||
|
|
||||||
|
vector<vector<Point>> bounds;
|
||||||
|
allBoundingBoxes(contours, bounds);
|
||||||
|
|
||||||
|
//Find largest bounding box
|
||||||
|
Size largest = Size(0,0);
|
||||||
|
for (vector<Point> box : bounds)
|
||||||
|
{
|
||||||
|
int height = abs(box[2].y - box[1].y);
|
||||||
|
int width = abs(box[1].x - box[0].x);
|
||||||
|
|
||||||
|
if (height > largest.height)
|
||||||
|
largest.height = height;
|
||||||
|
if (width > largest.width)
|
||||||
|
largest.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nr = 0;
|
||||||
|
|
||||||
|
//Create every image
|
||||||
|
for (vector<Point> box : bounds)
|
||||||
|
{
|
||||||
|
Point center = Point((box[0].x + box[2].x) / 2, (box[0].y + box[2].y) / 2);
|
||||||
|
|
||||||
|
Rect r = Rect(center.x - (largest.width / 2), center.y - (largest.height / 2),largest.width, largest.height);
|
||||||
|
Mat roi(image, r);
|
||||||
|
|
||||||
|
imwrite("output/" + name + "_" + to_string(nr) + ".bmp", roi);
|
||||||
|
|
||||||
|
nr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
#include <opencv2\imgproc\imgproc.hpp>
|
||||||
|
#include <opencv/cv.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
class BoundingBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BoundingBox();
|
||||||
|
~BoundingBox();
|
||||||
|
static int allBoundingBoxes(const vector<vector<Point>> & contours, vector<vector<Point>> & bbs);
|
||||||
|
static int split(const vector<vector<Point>> & contours, const Mat &image, string filename);
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
#include "FloodFill.h"
|
||||||
|
#include "BoundingBox.h"
|
||||||
|
|
||||||
|
|
||||||
|
FloodFill::FloodFill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FloodFill::~FloodFill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int FloodFill::enclosedPixels(const vector<Point>& contourVec, vector<Point> & regionPixels)
|
||||||
|
{
|
||||||
|
Point p = findStartPoint(contourVec);
|
||||||
|
regionPixels.push_back(p);
|
||||||
|
|
||||||
|
floodfill(contourVec, regionPixels, p);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FloodFill::floodfill(const vector<Point> & contourVec, vector<Point> & regionPixels, Point &p)
|
||||||
|
{
|
||||||
|
//Check four-connected
|
||||||
|
int pointsx[] = {0, 1, 0, -1};
|
||||||
|
int pointsy[] = {-1, 0, 1, 0};
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
Point check = Point(p.x + pointsx[i], p.y + pointsy[i]);
|
||||||
|
|
||||||
|
if (contains(contourVec, check))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (contains(regionPixels, check))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
regionPixels.push_back(check);
|
||||||
|
floodfill(contourVec, regionPixels, check);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point FloodFill::findStartPoint(vector<Point> vec)
|
||||||
|
{
|
||||||
|
int maxy = INT_MIN, maxx = INT_MIN, miny = INT_MAX, minx = INT_MAX;
|
||||||
|
|
||||||
|
for (Point p : vec)
|
||||||
|
{
|
||||||
|
if (p.y > maxy)
|
||||||
|
maxy = p.y;
|
||||||
|
|
||||||
|
if (p.y < miny)
|
||||||
|
miny = p.y;
|
||||||
|
|
||||||
|
if (p.x > maxx)
|
||||||
|
maxx = p.x;
|
||||||
|
|
||||||
|
if (p.x < minx)
|
||||||
|
minx = p.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int centery = (maxy + miny) / 2;
|
||||||
|
|
||||||
|
int x1 = 0, x2 = 0;
|
||||||
|
|
||||||
|
for (int x = minx; x <= maxx; x++)
|
||||||
|
{
|
||||||
|
if (contains(vec, Point(x, centery)))
|
||||||
|
{
|
||||||
|
if (x1 == 0)
|
||||||
|
{
|
||||||
|
x1 = x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x2 = x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int centerx = (x1 + x2) / 2;
|
||||||
|
Point start = Point(centerx, centery);
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FloodFill::contains(vector<Point> vec, Point p)
|
||||||
|
{
|
||||||
|
for (Point pnt : vec)
|
||||||
|
{
|
||||||
|
if (pnt.x == p.x && pnt.y == p.y)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int FloodFill::split(const vector<vector<Point>> & contours, const Mat &image, string filename)
|
||||||
|
{
|
||||||
|
//Create filenames
|
||||||
|
std::string base_filename = filename.substr(filename.find_last_of("/\\") + 1);
|
||||||
|
std::string::size_type const p(base_filename.find_last_of('.'));
|
||||||
|
std::string name = base_filename.substr(0, p);
|
||||||
|
|
||||||
|
vector<vector<Point>> regions;
|
||||||
|
regions.resize(contours.size());
|
||||||
|
|
||||||
|
for (int i = 0; i < contours.size(); i++)
|
||||||
|
{
|
||||||
|
vector<Point> temp;
|
||||||
|
enclosedPixels(contours[i], temp);
|
||||||
|
regions[i] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<vector<Point>> bounds;
|
||||||
|
BoundingBox::allBoundingBoxes(contours, bounds);
|
||||||
|
|
||||||
|
//Find largest bounding box
|
||||||
|
Size largest = Size(0, 0);
|
||||||
|
for (vector<Point> box : bounds)
|
||||||
|
{
|
||||||
|
int height = abs(box[2].y - box[1].y);
|
||||||
|
int width = abs(box[1].x - box[0].x);
|
||||||
|
|
||||||
|
if (height > largest.height)
|
||||||
|
largest.height = height;
|
||||||
|
if (width > largest.width)
|
||||||
|
largest.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nr = 0;
|
||||||
|
|
||||||
|
//Create every image
|
||||||
|
for (int i = 0; i < contours.size(); i++)
|
||||||
|
{
|
||||||
|
// Creeer een witte image
|
||||||
|
IplImage* iplimage = cvCreateImage(cvSize(image.cols, image.rows), IPL_DEPTH_8U, 3);
|
||||||
|
Mat resultImage = cvarrToMat(iplimage);
|
||||||
|
resultImage = Scalar(255, 255, 255);
|
||||||
|
|
||||||
|
//Kopieren van pixels
|
||||||
|
for (Point p : regions[i])
|
||||||
|
{
|
||||||
|
resultImage.at<uchar>(p) = image.at<uchar>(p);
|
||||||
|
}
|
||||||
|
for (Point p : contours[i])
|
||||||
|
{
|
||||||
|
resultImage.at<uchar>(p) = image.at<uchar>(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
Point center = Point((bounds[i][0].x + bounds[i][2].x) / 2, (bounds[i][0].y + bounds[i][2].y) / 2);
|
||||||
|
|
||||||
|
Rect r = Rect(center.x - (largest.width / 2), center.y - (largest.height / 2), largest.width, largest.height);
|
||||||
|
Mat roi(resultImage, r);
|
||||||
|
|
||||||
|
imwrite("output/" + name + "_" + to_string(nr) + ".bmp", roi);
|
||||||
|
|
||||||
|
nr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
#include <opencv2\imgproc\imgproc.hpp>
|
||||||
|
#include <opencv/cv.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class FloodFill
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FloodFill();
|
||||||
|
~FloodFill();
|
||||||
|
static int enclosedPixels(const vector<Point> & contourVec, vector<Point> & regionPixels);
|
||||||
|
static bool contains(vector<Point> vec, Point p);
|
||||||
|
static Point findStartPoint(vector<Point> vec);
|
||||||
|
static int floodfill(const vector<Point> & contourVec, vector<Point> & regionPixels, Point &p);
|
||||||
|
static int split(const vector<vector<Point>> & contours, const Mat &image, string filename);
|
||||||
|
};
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "avansvisionlib.h"
|
#include "avansvisionlib.h"
|
||||||
|
|
||||||
//direction values
|
//direction values
|
||||||
// starting at position 0. Definition of relative positions:
|
//starting at position 0. Definition of relative positions:
|
||||||
// 7 0 1
|
// 7 0 1
|
||||||
// 6 X 2
|
// 6 X 2
|
||||||
// 5 4 3
|
// 5 4 3
|
||||||
@@ -41,15 +41,9 @@ int allContours(Mat binaryImage, vector<vector<Point>>& contourVecVec)
|
|||||||
|
|
||||||
int dir = discoverNext(binaryImage, b0, discoverNextRelativeDirection(b0, c0));
|
int dir = discoverNext(binaryImage, b0, discoverNextRelativeDirection(b0, c0));
|
||||||
|
|
||||||
//if (dir < 0)
|
|
||||||
//{
|
|
||||||
// cout << "Er is niks aan de hand! " << " : " << b0 << " - " << c0 << endl;
|
|
||||||
//}
|
|
||||||
|
|
||||||
b1 = getDirPos(b0, dir);
|
b1 = getDirPos(b0, dir);
|
||||||
c1 = getDirPos(b0, (dir + 7) % 8);
|
c1 = getDirPos(b0, (dir + 7) % 8);
|
||||||
|
|
||||||
//TODO
|
|
||||||
if (!contains(contourVec, b1))
|
if (!contains(contourVec, b1))
|
||||||
contourVec.push_back(b1);
|
contourVec.push_back(b1);
|
||||||
|
|
||||||
@@ -61,8 +55,6 @@ int allContours(Mat binaryImage, vector<vector<Point>>& contourVecVec)
|
|||||||
contourVecVec.push_back(contourVec);
|
contourVecVec.push_back(contourVec);
|
||||||
}
|
}
|
||||||
|
|
||||||
//flip(contourVecVec);
|
|
||||||
|
|
||||||
return numberOfBlobs; //number of objects
|
return numberOfBlobs; //number of objects
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
//
|
//
|
||||||
// Jan Oostindie, dd 8-11-2016
|
// Jan Oostindie, dd 8-11-2016
|
||||||
//
|
//
|
||||||
//#pragma GCC push_options
|
|
||||||
//#pragma GCC optimize ("O0")
|
|
||||||
|
|
||||||
#include "opencv2/imgproc/imgproc.hpp"
|
#include "opencv2/imgproc/imgproc.hpp"
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
#include "opencv2/highgui/highgui.hpp"
|
||||||
@@ -15,6 +13,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include "avansvisionlib.h"
|
#include "avansvisionlib.h"
|
||||||
#include "MooreBoundaryTrackingAlgorithm.h"
|
#include "MooreBoundaryTrackingAlgorithm.h"
|
||||||
|
#include "BoundingBox.h"
|
||||||
|
#include "FloodFill.h"
|
||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@@ -81,8 +81,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// druk alle punten van alle gevonden contouren af
|
// druk alle punten van alle gevonden contouren af
|
||||||
string line;
|
string line;
|
||||||
cout << "Aantal gevonden contouren = " << contours.size() << endl;
|
cout << "Aantal gevonden contouren = " << aantal << endl;
|
||||||
getline(cin, line);
|
getline(cin, line);
|
||||||
|
/*
|
||||||
for (int i = 0; i < contours.size(); i++) {
|
for (int i = 0; i < contours.size(); i++) {
|
||||||
cout << "*** Contour " << i + 1 << " ***" << endl;
|
cout << "*** Contour " << i + 1 << " ***" << endl;
|
||||||
cout << "Press ENTER to continue....";
|
cout << "Press ENTER to continue....";
|
||||||
@@ -91,6 +92,26 @@ int main(int argc, char *argv[])
|
|||||||
cout << "(" << contours[i][j].x << "," << contours[i][j].y << ")" << endl;
|
cout << "(" << contours[i][j].x << "," << contours[i][j].y << ")" << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
cout << "Bounding boxes bepalen..." << endl;
|
||||||
|
vector<vector<Point>> bounds;
|
||||||
|
int aantalB = BoundingBox::allBoundingBoxes(contours, bounds);
|
||||||
|
|
||||||
|
cout << "Aantal gevonden boundaries = " << aantalB << endl;
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Split images
|
||||||
|
FloodFill::split(contours, image, argv[1]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
cout << "Fill" << endl;
|
||||||
|
vector<Point> region;
|
||||||
|
Point center = FloodFill::findStartPoint(contours[0]);
|
||||||
|
cout << "Center point: " << center.x << ", " << center.y << endl;
|
||||||
|
FloodFill::enclosedPixels(contours[0], region);
|
||||||
|
*/
|
||||||
|
|
||||||
// Creeer een witte image
|
// Creeer een witte image
|
||||||
IplImage* iplimage = cvCreateImage(cvSize(binary16S.cols, binary16S.rows), IPL_DEPTH_8U, 3);
|
IplImage* iplimage = cvCreateImage(cvSize(binary16S.cols, binary16S.rows), IPL_DEPTH_8U, 3);
|
||||||
@@ -99,13 +120,19 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// teken de contouren op de witte image
|
// teken de contouren op de witte image
|
||||||
drawContours(contourImage, contours, -1, CV_RGB(255, 0, 0));
|
drawContours(contourImage, contours, -1, CV_RGB(255, 0, 0));
|
||||||
|
/*
|
||||||
|
drawContours(contourImage, bounds, -1, CV_RGB(0, 0, 255));
|
||||||
|
|
||||||
|
for (Point p : region)
|
||||||
|
{
|
||||||
|
circle(contourImage, p, 1, CV_RGB(0, 255, 0));
|
||||||
|
}*/
|
||||||
|
|
||||||
// druk het image met de contouren af
|
// druk het image met de contouren af
|
||||||
imshow("Found contours", contourImage);
|
imshow("Found contours", contourImage);
|
||||||
waitKey(0);
|
waitKey(0);
|
||||||
|
|
||||||
//haal bending energy waarde op
|
//haal bending energy waarde op
|
||||||
|
|
||||||
|
|
||||||
cout << "Bending Energy" << endl << "-----------" << endl;
|
cout << "Bending Energy" << endl << "-----------" << endl;
|
||||||
|
|
||||||
@@ -115,10 +142,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string pipo;
|
waitKey(0);
|
||||||
cin >> pipo;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//#pragma GCC pop_options
|
|
||||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 693 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 212 B |
|
After Width: | Height: | Size: 175 B |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 182 B |
|
After Width: | Height: | Size: 199 B |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |