improve finding algorithm and add export
This commit is contained in:
parent
4ccffe4636
commit
c70575547f
1 changed files with 82 additions and 6 deletions
|
@ -11,6 +11,8 @@ PImage cam_reference;
|
||||||
PImage cam_currentbox;
|
PImage cam_currentbox;
|
||||||
PGraphics canvas;
|
PGraphics canvas;
|
||||||
|
|
||||||
|
PImage image_clear;
|
||||||
|
|
||||||
|
|
||||||
int currentID=0;
|
int currentID=0;
|
||||||
//int MAXID = 50; //inclusive
|
//int MAXID = 50; //inclusive
|
||||||
|
@ -36,9 +38,9 @@ ArrayList<Box> boxes=new ArrayList<Box>();
|
||||||
//int FINDBOXES_MINIMUMBRIGHTNESS; //brightness difference required
|
//int FINDBOXES_MINIMUMBRIGHTNESS; //brightness difference required
|
||||||
int FINDBOXES_MAXIMUMPIXELDISTANCE; //distance to add pixel to existing box
|
int FINDBOXES_MAXIMUMPIXELDISTANCE; //distance to add pixel to existing box
|
||||||
PVector MINBOXSIZE; //minimum box size to accept box
|
PVector MINBOXSIZE; //minimum box size to accept box
|
||||||
int TIME_FIND = 500; //time in ms to find box in image
|
int TIME_FIND = 100; //time in ms to find box in image
|
||||||
int TIME_RESULT = 250; //time in ms to show success/fail
|
int TIME_RESULT = 100; //time in ms to show success/fail
|
||||||
int TIME_TURNOFF = 250; //time in ms to wait to turn off
|
int TIME_TURNOFF = 100; //time in ms to wait to turn off
|
||||||
float MINBRIGHTNESS_PERCENTILE=0.98; //percentile for minbrightness calculation (how many pixels will be considered). between 0(all) and 1(none). 0=all pixels. ->1=only bright pixels
|
float MINBRIGHTNESS_PERCENTILE=0.98; //percentile for minbrightness calculation (how many pixels will be considered). between 0(all) and 1(none). 0=all pixels. ->1=only bright pixels
|
||||||
int MINIMUMALLOWEDBRIGHTNESS=50; //minimum brightness. will be limited to this lower bound if no box in image (percentile calculation yields low value)
|
int MINIMUMALLOWEDBRIGHTNESS=50; //minimum brightness. will be limited to this lower bound if no box in image (percentile calculation yields low value)
|
||||||
|
|
||||||
|
@ -73,6 +75,7 @@ void setup() {
|
||||||
cam = new Capture(this, cameras[1]); //linux
|
cam = new Capture(this, cameras[1]); //linux
|
||||||
cam.start();
|
cam.start();
|
||||||
}
|
}
|
||||||
|
image_clear=cam.copy();
|
||||||
cam_reference=cam.copy();
|
cam_reference=cam.copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,6 +129,7 @@ void checkState() {
|
||||||
switch(searchstate) {
|
switch(searchstate) {
|
||||||
case 0: //0=get reference image and ping box
|
case 0: //0=get reference image and ping box
|
||||||
cam_reference=cam.copy();
|
cam_reference=cam.copy();
|
||||||
|
println();
|
||||||
println("Searching BoxID "+str(currentID));
|
println("Searching BoxID "+str(currentID));
|
||||||
|
|
||||||
|
|
||||||
|
@ -147,6 +151,7 @@ void checkState() {
|
||||||
Box box = findSingleBox(cam_currentbox); //find single box in this image
|
Box box = findSingleBox(cam_currentbox); //find single box in this image
|
||||||
if (box!=null && (box.getBoxSize().x<MINBOXSIZE.x || box.getBoxSize().y<MINBOXSIZE.y)) { //box too small
|
if (box!=null && (box.getBoxSize().x<MINBOXSIZE.x || box.getBoxSize().y<MINBOXSIZE.y)) { //box too small
|
||||||
box=null;
|
box=null;
|
||||||
|
println(" Box too small");
|
||||||
}
|
}
|
||||||
if (box!=null) { //if box found
|
if (box!=null) { //if box found
|
||||||
PVector boxsize = box.getBoxSize();
|
PVector boxsize = box.getBoxSize();
|
||||||
|
@ -190,6 +195,7 @@ void checkState() {
|
||||||
currentID++;
|
currentID++;
|
||||||
if (currentID>MAXID) {
|
if (currentID>MAXID) {
|
||||||
running=false;
|
running=false;
|
||||||
|
cam_reference=image_clear; //show normal camera image
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -200,19 +206,24 @@ void keyPressed() {
|
||||||
cam_reference=cam.copy();
|
cam_reference=cam.copy();
|
||||||
println("New Reference Set");
|
println("New Reference Set");
|
||||||
|
|
||||||
} else if (key == 's' ){
|
} else if (key == 10){ //ENTER
|
||||||
running=true;
|
running=true;
|
||||||
colorAllOff(); //turn box off
|
colorAllOff(); //turn box off
|
||||||
currentID=0; //reset
|
currentID=0; //reset
|
||||||
searchstate=0;
|
searchstate=0;
|
||||||
boxes.clear(); //reset found boxes
|
boxes.clear(); //reset found boxes
|
||||||
println("Search started");
|
println("Search started");
|
||||||
|
} else if (key == 'r' ){
|
||||||
|
running=false;
|
||||||
|
cam_reference=image_clear; //show normal camera image
|
||||||
|
} else if(key == 's') {
|
||||||
|
saveBoxConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int getPercentileBrightness(PImage img, float percentile) { //percentile between 0 and 1
|
int getPercentileBrightness(PImage img, float percentile) { //percentile between 0 and 1
|
||||||
println("percentile="+str(percentile));
|
|
||||||
percentile=min(max(percentile,0.0),1.0); //limit to 0 to 1
|
percentile=min(max(percentile,0.0),1.0); //limit to 0 to 1
|
||||||
int[] brightness=new int[img.pixels.length];
|
int[] brightness=new int[img.pixels.length];
|
||||||
for (int i=0;i<brightness.length;i++) {
|
for (int i=0;i<brightness.length;i++) {
|
||||||
|
@ -256,6 +267,30 @@ ArrayList<Box> findBoxes(PImage img) {
|
||||||
}
|
}
|
||||||
|
|
||||||
println(" findBoxes(): foundboxes.size="+foundboxes.size());
|
println(" findBoxes(): foundboxes.size="+foundboxes.size());
|
||||||
|
//merge overlapping boxes together
|
||||||
|
for (int i=0;i<foundboxes.size();i++) {
|
||||||
|
Box fbox = foundboxes.get(i);
|
||||||
|
if (fbox.getMarked()) { continue; } //skip if this box was marked
|
||||||
|
for (int i2=i+1;i2<foundboxes.size();i2++) {
|
||||||
|
Box fbox2 = foundboxes.get(i2);
|
||||||
|
if (fbox.getMarked()) { continue; } //skip if this box was marked
|
||||||
|
if (fbox2.isInside(fbox) && fbox.isInside(fbox2)) {
|
||||||
|
fbox.merge(fbox2); //add pixels to one box
|
||||||
|
fbox2.setMarked(true); //mark for deletion
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i=0;i<foundboxes.size();i++) { //remove marked boxes
|
||||||
|
Box fbox = foundboxes.get(i);
|
||||||
|
if (fbox.getMarked()) { //if marked
|
||||||
|
foundboxes.remove(fbox); //remove merged box
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
println(" after merge: foundboxes.size="+foundboxes.size());
|
||||||
return foundboxes;
|
return foundboxes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,10 +308,17 @@ Box findSingleBox(PImage img) {
|
||||||
public class Box {
|
public class Box {
|
||||||
ArrayList<PVector> boxpixels;
|
ArrayList<PVector> boxpixels;
|
||||||
int boxid;
|
int boxid;
|
||||||
|
boolean marked=false;
|
||||||
|
|
||||||
public Box() {
|
public Box() {
|
||||||
boxpixels = new ArrayList<PVector>();
|
boxpixels = new ArrayList<PVector>();
|
||||||
}
|
}
|
||||||
|
public void setMarked(boolean pm) {
|
||||||
|
marked=pm;
|
||||||
|
}
|
||||||
|
public boolean getMarked() {
|
||||||
|
return marked;
|
||||||
|
}
|
||||||
|
|
||||||
public void addPixel(PVector newpix) {
|
public void addPixel(PVector newpix) {
|
||||||
boxpixels.add(newpix);
|
boxpixels.add(newpix);
|
||||||
|
@ -327,7 +369,7 @@ public class Box {
|
||||||
return boxsize;
|
return boxsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PVector getBoxCenter(){ //returns widht and height as vector
|
public PVector getBoxCenter(){ //returns width and height as vector
|
||||||
PVector upperleft= new PVector(MAX_FLOAT,MAX_FLOAT); //min x and y
|
PVector upperleft= new PVector(MAX_FLOAT,MAX_FLOAT); //min x and y
|
||||||
PVector lowerright= new PVector(0,0); //max x and y
|
PVector lowerright= new PVector(0,0); //max x and y
|
||||||
for (PVector pbox : boxpixels) {
|
for (PVector pbox : boxpixels) {
|
||||||
|
@ -344,6 +386,28 @@ public class Box {
|
||||||
public int getPixelNumber() {
|
public int getPixelNumber() {
|
||||||
return this.boxpixels.size();
|
return this.boxpixels.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isInside(Box pbox) {
|
||||||
|
int pixelsinside=0; //for counting pixels of pbox inside this box
|
||||||
|
PVector pboxsize=pbox.getBoxSize();
|
||||||
|
PVector pboxcenter=pbox.getBoxCenter();
|
||||||
|
float pboxX1 = pboxcenter.x-pboxsize.x/2;
|
||||||
|
float pboxX2 = pboxcenter.x+pboxsize.x/2;
|
||||||
|
float pboxY1 = pboxcenter.y-pboxsize.y/2;
|
||||||
|
float pboxY2 = pboxcenter.y+pboxsize.y/2;
|
||||||
|
for (PVector pix : boxpixels) {
|
||||||
|
if (pix.x>pboxX1 && pix.x<pboxX2 && pix.y>pboxY1 && pix.y<pboxY2) { //is inside
|
||||||
|
pixelsinside++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pixelsinside>0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void merge(Box mergebox) { //merge pixels from mergebox inside this box
|
||||||
|
boxpixels.addAll(mergebox.getPixels());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void colorBox(int id, color c)
|
void colorBox(int id, color c)
|
||||||
|
@ -354,3 +418,15 @@ void colorAllOff()
|
||||||
{
|
{
|
||||||
sPort.write("A,0\n");
|
sPort.write("A,0\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void saveBoxConfig(){
|
||||||
|
String[] boxconfig=new String[boxes.size()];
|
||||||
|
for (int i=0;i<boxes.size();i++) {
|
||||||
|
Box box=boxes.get(i);
|
||||||
|
PVector boxcenter=box.getBoxCenter();
|
||||||
|
PVector boxsize=box.getBoxSize();
|
||||||
|
boxconfig[i]=box.getBoxID()+";"+(boxcenter.x/cam.width)+";"+(boxcenter.y/cam.height)+";"+(boxsize.x/cam.width)+";"+(boxsize.y/cam.height);
|
||||||
|
}
|
||||||
|
saveStrings("boxconfig.txt", boxconfig);
|
||||||
|
println("saved");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue