| No edit summary | |||
| Line 51: | Line 51: | ||
|      euglenaList.add(new Euglena(r.x, r.y)); |      euglenaList.add(new Euglena(r.x, r.y)); | ||
|    } |    } | ||
| } | |||
| void deleteEuglena() { | |||
|   ListIterator<Euglena> iter = euglenaList.listIterator(); | |||
|   float newmdx = 0; | |||
|   float newmdy = 0; | |||
|   while (iter.hasNext()) { | |||
|     Euglena e = iter.next(); | |||
|     if (e.found==false) iter.remove(); | |||
|     else { | |||
|       e.found = false; | |||
|       newmdx = newmdx + e.dx; | |||
|       newmdy = newmdy + e.dy; | |||
|     } | |||
|   } | |||
|   if (euglenaList.size() > 0) { | |||
|     newmdx = newmdx / euglenaList.size(); | |||
|     newmdy = newmdy / euglenaList.size(); | |||
|   } else { | |||
|     newmdx = 0; | |||
|     newmdy = 0; | |||
|   } | |||
|   mdx += (newmdx - mdx)*0.01; | |||
|   mdy += (newmdy - mdy)*0.01; | |||
| } | } | ||
| </source> | </source> | ||
Revision as of 09:25, 7 June 2015
Quick and dirty Euglena tracking using OpenCV, Syphon, and OSC.
- Full source: File:TrackEuglenaSyphonOSC.zip
Threshold based Euglena detection
opencv.loadImage(cam);
opencv.gray();
opencv.invert();
threshold = int(map(mouseX,0,width,0,255));
opencv.erode();
opencv.dilate();
    
opencv.threshold(threshold);
// ...
contours = opencv.findContours();Skipping large/small contours
for (Contour contour : contours) {
      float a = contour.area();
      Rectangle r = contour.getBoundingBox();
      float wh = float(r.width)/float(r.height);
      if (a > minArea && wh > 0.1 && wh < 10 && a < maxArea) {
      // ...Maintaining Euglena identity in a list (based on proximity from frame to frame), computing speed as dx, dy
void checkEuglena(Contour c) {
  boolean found = false;
  Rectangle r = c.getBoundingBox();
  for (Euglena e : euglenaList) {
    if (dist(e.x, e.y, r.x, r.y) < distanceThreshold) {
      e.dx = e.x - r.x;
      e.dy = e.y - r.y;
      e.x = r.x;
      e.y = r.y;
      e.found = true;
      found = true;
      break;
    }
  }
  if (!found) {
    euglenaList.add(new Euglena(r.x, r.y));
  }
}
void deleteEuglena() {
  ListIterator<Euglena> iter = euglenaList.listIterator();
  float newmdx = 0;
  float newmdy = 0;
  while (iter.hasNext()) {
    Euglena e = iter.next();
    if (e.found==false) iter.remove();
    else {
      e.found = false;
      newmdx = newmdx + e.dx;
      newmdy = newmdy + e.dy;
    }
  }
  if (euglenaList.size() > 0) {
    newmdx = newmdx / euglenaList.size();
    newmdy = newmdy / euglenaList.size();
  } else {
    newmdx = 0;
    newmdy = 0;
  }
  mdx += (newmdx - mdx)*0.01;
  mdy += (newmdy - mdy)*0.01;
}