Αγορά Πολιτών

Τρόπος Συμμετοχής

Χορηγίες

Πολίτες στην Αγορά

Έχουμε 432 επισκέπτες συνδεδεμένους

Επικοινωνία

Γερμανία 004917667046073 (SMS)

7/3/2017, 20:00

Zeppelin: Beyond Gravity

 

Plausible deniability

 

Images of German w & s

 

Crimes against Humanity

 

"Chimera" - "Bellerophon"

 

pr. Donald Trump

 

  

Legal Notice 87

 

Βδέλλες, αποικιοκρατικές

 

Being a German

 

Legal Notice 84

 

Dirty colonial methods

 

Georgi Markov, BG - KGB

 

Samples of Barbarity

 

Ελλάδα - αποκόλληση

 

Έλληνες, στο έλεος...

 

Harvester's log 16/3/17

 

 

Legal Notice 66

 

Execrable

 

Legal Notice 62

 

  

My story

 

  

Aggression?

 

  

Η Εστία μου

 

  

Why so untidy?

 

  

Αποικιοκρατία

 

  

Εξόντωση Ελλήνων αντιφρονούντων;

 

  

Ζήτημα εμπιστοσύνης

 

  

Μεθοδικότητα

 

  

Ανοικτή Επιστολή πρέσβη ΗΠΑ

Αφορμή, U2RIT vs Ελλάδα;

Βιοηθική

A request to U2RIT

Colonial aggression - 2

Open Letter to UN S.G.

Open Letter to p.C. & p. O.

Δήλωση πρόθεσης επαναπατρισμού

 

Ο "εφιάλτης" της Νυρεμβέργης

Συλλογή Φωτογραφιών

Αίτημα προστασίας, προς Ιταλία

Chroma key, background removal

Science and Ethics

Να συμβάλει και η U2RIT

Θα ξαναφτιάξουν πολλές φορές Άουσβιτς και Zyclon B

 

Split-Screen effect

Η Ζωή είναι Ωραία.

Βόρεια Κορέα

Λευτεριά στους Έλληνες, εξανα- γκαστικά "Εξαφανισμένους"

 

Μυστικές δίκες;

Trustworthiness

Πολιτισμό, ή, απληστία;

Ακραία Στυγνότητα

Η Τέχνη της Επιβίωσης

Political Asylum 3

Επιστροφή στις ρίζες

The Human Cost of Torture

An urgent appeal for solidarity

More obvious than the Sun

Western "culture"

Political Asylum

Έννομη Προστασία

Μια μήνυση που εγείρει ερωτηματικά

 

 

 

Honor your father...

Noise

Creative Greeks

A pair of Dictatorships

Ρομποτική Οπτική Ανίχνευση Φραουλών PDF Εκτύπωση E-mail
Αξιολόγηση Χρήστη: / 0
ΧείριστοΆριστο 
Συνεννόηση για Δράση - Απόψεις
Συντάχθηκε απο τον/την Χρήστος Μπούμπουλης (Christos Boumpoulis)   
Τρίτη, 21 Μάρτιος 2017 22:43

strawberry-rv-1.JPG



strawberry-rv-2.JPG


Ρομποτική Οπτική Ανίχνευση Φραουλών


Η σχεδιαζόμενη αυτόνομη μηχανή συγκομιδής φράουλας θα εντοπίζει τις θέσεις των φραουλών με ένα σύστημα ρομποτικής οπτικής ανίχνευσης.

Συγκεκριμένα, δύο κάμερες, τοποθετημένες στο εξωτερικό άκρο του ρομποτικού βραχίονα θα μετατρέπουν, την φυσική εικόνα των φραουλιών, σε ηλεκτρονική μορφή, την οποία, ο ηλεκτρονικός υπολογιστής της μηχανής συγκομιδής, θα επεξεργάζεται προκειμένου να εντοπίζει τη θέση των φραουλών.

Τις δυο προηγούμενες μέρες προετοίμασα μια πρόχειρη μορφή του εν λόγω συστήματος.

Δηλαδή, κατασκεύασα λογισμικό το οποίο, δέχεται ως πληροφορία ροή εικόνας (βίντεο) και σε πραγματικό χρόνο εντοπίζει τις θέσεις των φραουλών οι οποίες απεικονίζονται στη ροή εικόνας (στο βίντεο). Για την επιβεβαίωση, δε, του ορθού εντοπισμού, τοποθετεί, πάνω στις εικόνες των φραουλών που εντόπισε, ένα κόκκινο κύκλο και δύο αριθμούς οι οποίοι σχετίζονται με την απόχρωση του χρώματος της αντίστοιχης φράουλας.

Στις ανωτέρω δυο φωτογραφίες εμφανίζονται στιγμιότυπα της εν λόγω οπτικής ανίχνευσης.

Για το λογισμικό χρησιμοποιήθηκαν:

  • Visual Studio 2010 C++

  • OpenCV v 2.4.10

  • Ελεύθερο λογισμικό του διαδικτύου, σε γλώσσα προγραμματισμού C++, το οποίο προσάρμοσα στις ανάγκες της μηχανής συγκομιδής.

  • Βίντεο το οποίο απεικονίζει φραουλιές σε εποχή συγκομιδής.


Χρήστος Μπούμπουλης

οικονομολόγος


Υ.Γ.: Υπάρχει βίντεο (15 ΜΒ) που απεικονίζει, σε πραγματικό χρόνο, τη δοκιμή του συστήματος που περιγράφω. Δεν το ανέβασα στο διαδίκτυο επειδή η ταχύτητα σύνδεσης που διαθέτω είναι πολύ αργή (5 kB/s). Με πρώτη ευκαιρία, θα το ανεβάσω.


Παράρτημα


Το λογισμικό

#include <sstream>

#include <string>

#include <iostream>

#include <vector>

#include <opencv\cv.h>

#include <opencv\highgui.h>

#include "Shape.h"


using namespace cv;

using namespace std;


//initial min and max HSV filter values.

//these will be changed using trackbars

int H_MIN = 0;

int H_MAX = 256;

int S_MIN = 0;

int S_MAX = 256;

int V_MIN = 0;

int V_MAX = 256;


//default capture width and height

const int FRAME_WIDTH = 640;

const int FRAME_HEIGHT = 480;


//max number of objects to be detected in frame

const int MAX_NUM_OBJECTS=50;


//minimum and maximum object area

const int MIN_OBJECT_AREA = 20*20;

const int MAX_OBJECT_AREA = FRAME_HEIGHT*FRAME_WIDTH/1.5;

// const int MIN_OBJECT_AREA = 40*40;

// const int MAX_OBJECT_AREA = FRAME_HEIGHT*FRAME_WIDTH/1.5;


//names that will appear at the top of each window

const string windowName = "Original Image";

const string windowName1 = "HSV Image";

const string windowName2 = "Thresholded Image";

const string windowName3 = "After Morphological Operations";

const string trackbarWindowName = "Trackbars";


void on_trackbar( int, void* )

{//This function gets called whenever a

// trackbar position is changed


}


string intToString(int number){



std::stringstream ss;

ss << number;

return ss.str();

}


void createTrackbars(){

//create window for trackbars


namedWindow(trackbarWindowName,0);

//create memory to store trackbar name on window

char TrackbarName[50];

sprintf( TrackbarName, "H_MIN", H_MIN);

sprintf( TrackbarName, "H_MAX", H_MAX);

sprintf( TrackbarName, "S_MIN", S_MIN);

sprintf( TrackbarName, "S_MAX", S_MAX);

sprintf( TrackbarName, "V_MIN", V_MIN);

sprintf( TrackbarName, "V_MAX", V_MAX);

//create trackbars and insert them into window

//3 parameters are: the address of the variable that is changing when the trackbar is moved(eg.H_LOW),

//the max value the trackbar can move (eg. H_HIGH),

//and the function that is called whenever the trackbar is moved(eg. on_trackbar)

// ----> ----> ---->

createTrackbar( "H_MIN", trackbarWindowName, &H_MIN, H_MAX, on_trackbar );

createTrackbar( "H_MAX", trackbarWindowName, &H_MAX, H_MAX, on_trackbar );

createTrackbar( "S_MIN", trackbarWindowName, &S_MIN, S_MAX, on_trackbar );

createTrackbar( "S_MAX", trackbarWindowName, &S_MAX, S_MAX, on_trackbar );

createTrackbar( "V_MIN", trackbarWindowName, &V_MIN, V_MAX, on_trackbar );

createTrackbar( "V_MAX", trackbarWindowName, &V_MAX, V_MAX, on_trackbar );

}


void drawObject(vector<Shape> theShapes, Mat &frame){


for(int i = 0; i < theShapes.size(); i++)

{

cv::circle(frame,cv::Point(theShapes.at(i).getXPos(),theShapes.at(i).getYPos()),10,cv::Scalar(0,0,255));

cv::putText(frame,intToString(theShapes.at(i).getXPos())+ " , " + intToString(theShapes.at(i).getYPos()),cv::Point(theShapes.at(i).getXPos(),theShapes.at(i).getYPos()+20),1,1,Scalar(0,255,0));

}

}


void morphOps(Mat &thresh){


//create structuring element that will be used to "dilate" and "erode" image.

//the element chosen here is a 3px by 3px rectangle


Mat erodeElement = getStructuringElement( MORPH_RECT,Size(3,3));

//dilate with larger element so make sure object is nicely visible

Mat dilateElement = getStructuringElement( MORPH_RECT,Size(8,8));


erode(thresh,thresh,erodeElement);

erode(thresh,thresh,erodeElement);



dilate(thresh,thresh,dilateElement);

dilate(thresh,thresh,dilateElement);


}

void trackFilteredObject(Mat threshold,Mat HSV, Mat &cameraFeed)

{


vector<Shape> greens;

vector<Shape> blues;

vector<Shape> reds;


Mat temp;

threshold.copyTo(temp);

//these two vectors needed for output of findContours

vector< vector<Point> > contours;

vector<Vec4i> hierarchy;

//find contours of filtered image using openCV findContours function

findContours(temp,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );

//use moments method to find our filtered object

double refArea = 0;

bool objectFound = false;

if (hierarchy.size() > 0) {

int numObjects = hierarchy.size();

//if number of objects greater than MAX_NUM_OBJECTS we have a noisy filter

if(numObjects < MAX_NUM_OBJECTS)

{

for (int index = 0; index >= 0; index = hierarchy[index][0])

{


Moments moment = moments((cv::Mat)contours[index]);

double area = moment.m00;


//if the area is less than 20 px by 20px then it is probably just noise

//if the area is the same as the 3/2 of the image size, probably just a bad filter

//we only want the object with the largest area so we safe a reference area each

//iteration and compare it to the area in the next iteration.

if(area>MIN_OBJECT_AREA){


Shape green, red, blue;

green.setXPos(moment.m10/area);

green.setYPos(moment.m01/area);


blue.setXPos(moment.m10/area);

blue.setYPos(moment.m01/area);


red.setXPos(moment.m10/area);

red.setYPos(moment.m01/area);


greens.push_back(green);

reds.push_back(red);

blues.push_back(blue);


objectFound = true;


}

else objectFound = false;

}

//let user know you found an object

if(objectFound ==true)

{

//draw object location on screen

drawObject(greens,cameraFeed);

}


}else putText(cameraFeed,"TOO MUCH NOISE! ADJUST FILTER",Point(0,50),1,2,Scalar(0,0,255),2);

}

}


int main(int argc, char* argv[])

{

//if we would like to calibrate our filter values, set to true.

bool calibrationMode = false;


//Matrix to store each frame of the webcam feed

Mat cameraFeed;

Mat threshold;

Mat HSV;


if(calibrationMode){

//create slider bars for HSV filtering

createTrackbars();

}

//video capture object to acquire webcam feed

VideoCapture capture;

//open capture object at location zero (default location for webcam)

capture.open("C:/Documents and Settings/a/Επιφάνεια εργασίας/strawberry12.mpg");

//set height and width of capture frame

capture.set(CV_CAP_PROP_FRAME_WIDTH,FRAME_WIDTH);

capture.set(CV_CAP_PROP_FRAME_HEIGHT,FRAME_HEIGHT);


//start an infinite loop where webcam feed is copied to cameraFeed matrix

//all of our operations will be performed within this loop

while(1)

{

//store image to matrix

capture.read(cameraFeed);


//convert frame from BGR to HSV colorspace

cvtColor(cameraFeed,HSV,COLOR_BGR2HSV);


//toggle calibration mode to select between HSV slider and embedded HSV values

if(calibrationMode==true)

// if(calibrationMode==true)

{

//if in calibration mode, we track objects based on the HSV slider values.

cvtColor(cameraFeed,HSV,COLOR_BGR2HSV);

inRange(HSV,Scalar(H_MIN,S_MIN,V_MIN),Scalar(H_MAX,S_MAX,V_MAX),threshold);

morphOps(threshold);

imshow(windowName2,threshold);

trackFilteredObject(threshold,HSV,cameraFeed);

}

else

{

Shape green, blue, red;


//set these values for how you detect blue, green, and red shapes in the environment

green.setHSVMin(Scalar(1,1,1));

green.setHSVMax(Scalar(2,2,2));

blue.setHSVMin(Scalar(1,1,1));

blue.setHSVMax(Scalar(2,2,2));

red.setHSVMin(Scalar(170,150,60));

red.setHSVMax(Scalar(179,255,255));


// green.setHSVMin(Scalar(18,117,46));

// green.setHSVMax(Scalar(105,230,117));

// blue.setHSVMin(Scalar(18,117,46));

// blue.setHSVMax(Scalar(105,230,117));

// red.setHSVMin(Scalar(18,117,46));

// red.setHSVMax(Scalar(105,230,117));



//if not in calibration mode, we use predefined HSV color values to track all objects

cvtColor(cameraFeed,HSV,COLOR_BGR2HSV);

inRange(HSV,green.getHSVMin(),green.getHSVMax(),threshold);

morphOps(threshold);

trackFilteredObject(threshold,HSV,cameraFeed);


//if not in calibration mode, we use predefined HSV color values to track all objects

cvtColor(cameraFeed,HSV,COLOR_BGR2HSV);

inRange(HSV,blue.getHSVMin(),blue.getHSVMax(),threshold);

morphOps(threshold);

trackFilteredObject(threshold,HSV,cameraFeed);


//if not in calibration mode, we use predefined HSV color values to track all objects

cvtColor(cameraFeed,HSV,COLOR_BGR2HSV);

inRange(HSV,red.getHSVMin(),red.getHSVMax(),threshold);

morphOps(threshold);

trackFilteredObject(threshold,HSV,cameraFeed);

}


//debug only - show threshold data

imshow(windowName2,threshold);


//debug only - show HSV data

imshow(windowName1,HSV);


//show the camera feed

imshow(windowName,cameraFeed);


//delay 30ms so that screen can refresh. image will not appear without this waitKey() command

waitKey(30);

}

return 0;

}


#include "Shape.h"



Shape::Shape(void)

{

}


Shape::Shape(string name)

{

setType(name);

if(name == "green")

{

setHSVMin(Scalar(1,1,1));

setHSVMax(Scalar(2,2,2));

}

if(name == "blue")

{

setHSVMin(Scalar(1,1,1));

setHSVMax(Scalar(2,2,2));

}

if(name == "red")

{

setHSVMin(Scalar(170,150,60));

setHSVMax(Scalar(179,255,255));

}

}



Shape::~Shape(void)

{

}


int Shape::getXPos()

{

return Shape::xPos;

}


int Shape::getYPos()

{

return Shape::yPos;

}


void Shape::setXPos(int x)

{

Shape::xPos = x;

}


void Shape::setYPos(int y)

{

Shape::yPos = y;

}


Scalar Shape::getHSVMin()

{

return Shape::HSVMin;

}


Scalar Shape::getHSVMax()

{

return Shape::HSVMax;

}


void Shape::setHSVMin(Scalar min)

{

Shape::HSVMin = min;

}


void Shape::setHSVMax(Scalar max)

{

Shape::HSVMax = max;

}


#pragma once

#include <string>

#include <opencv\highgui.h>

#include <opencv\cv.h>


using namespace std; //saves you having to type "std::" all over the place

using namespace cv;


class Shape

{

public:

Shape(void);

~Shape(void);


Shape(string name);


int getXPos();

int getYPos();

void setXPos(int x);

void setYPos(int y);


Scalar getHSVMin();

Scalar getHSVMax();


void setHSVMin(Scalar min);

void setHSVMax(Scalar max);


string getType(){return type;}

void setType(string t){type = t;}


Scalar getColor()

{

return color;

}


void setColor(Scalar aColor)

{

color = aColor;

}


private:

int xPos, yPos;

string type;

cv::Scalar HSVMin, HSVMax;

Scalar color;

};



Τελευταία Ενημέρωση στις Τρίτη, 21 Μάρτιος 2017 23:00