/*
* 作成日: 2008/04/24
*/
package jp.ac.fit.asura.nao.vision;
import static jp.ac.fit.asura.nao.vision.VisualObjects.Ball;
import static jp.ac.fit.asura.nao.vision.VisualObjects.BlueGoal;
import static jp.ac.fit.asura.nao.vision.VisualObjects.YellowGoal;
import static jp.ac.fit.asura.nao.vision.VisualObjects.RedNao;
import static jp.ac.fit.asura.nao.vision.VisualObjects.BlueNao;
import static jp.ac.fit.asura.nao.vision.VisualParam.Boolean.USE_HOUGH;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import jp.ac.fit.asura.nao.Camera;
import jp.ac.fit.asura.nao.Image;
import jp.ac.fit.asura.nao.RobotContext;
import jp.ac.fit.asura.nao.VisualCycle;
import jp.ac.fit.asura.nao.VisualFrameContext;
import jp.ac.fit.asura.nao.event.VisualEventListener;
import jp.ac.fit.asura.nao.vision.perception.BallVision;
import jp.ac.fit.asura.nao.vision.perception.BallVisualObject;
import jp.ac.fit.asura.nao.vision.perception.BlobVision;
import jp.ac.fit.asura.nao.vision.perception.GeneralVision;
import jp.ac.fit.asura.nao.vision.perception.GoalVision;
import jp.ac.fit.asura.nao.vision.perception.GoalVisualObject;
import jp.ac.fit.asura.nao.vision.perception.HoughVision;
import jp.ac.fit.asura.nao.vision.perception.RobotVision;
import jp.ac.fit.asura.nao.vision.perception.RobotVisualObject;
import jp.ac.fit.asura.nao.vision.perception.VisualObject;
/**
* 画像認識の中枢.
*
* 値はすべて,radian/mm/左上原点(画像平面座標系(plane))の系で扱います.
*
* たまにイメージ座標系(中央が原点)のものもあります.
*
* @author sey
*
* @version $Id: VisualCortex.java 704 2008-10-23 17:25:51Z sey $
*
*/
public class VisualCortex implements VisualCycle {
private GCD gcd;
private Map<VisualObjects, VisualObject> map;
private BlobVision blobVision;
private BallVision ballVision;
private GoalVision goalVision;
private RobotVision robotVision;
private GeneralVision generalVision;
private HoughVision houghVision;
private VisualContext context;
private List<VisualEventListener> listeners;
/**
*
*/
public VisualCortex() {
listeners = new CopyOnWriteArrayList<VisualEventListener>();
map = new EnumMap<VisualObjects, VisualObject>(VisualObjects.class);
map.put(Ball, new BallVisualObject());
map.put(YellowGoal, new GoalVisualObject(YellowGoal));
map.put(BlueGoal, new GoalVisualObject(BlueGoal));
map.put(RedNao, new RobotVisualObject(RedNao));
map.put(BlueNao, new RobotVisualObject(BlueNao));
blobVision = new BlobVision();
ballVision = new BallVision();
goalVision = new GoalVision();
robotVision = new RobotVision();
generalVision = new GeneralVision();
houghVision = new HoughVision();
}
@Override
public void init(RobotContext rctx) {
Camera camera = rctx.getCamera();
context = new VisualContext(rctx);
context.ballVision = ballVision;
context.blobVision = blobVision;
context.generalVision = generalVision;
context.goalVision = goalVision;
context.robotVision = robotVision;
context.camera = camera;
context.objects = map;
}
@Override
public void start() {
}
@Override
public void step(VisualFrameContext frameContext) {
clear();
frameContext.setVisualContext(context);
context.setFrameContext(frameContext);
Image image = frameContext.getImage();
context.image = image;
int length = image.getWidth() * image.getHeight();
if (context.gcdPlane == null || context.gcdPlane.length != length) {
context.gcdPlane = new byte[length];
}
if (gcd != null)
gcd.detect(context.image, context.gcdPlane);
updateContext(frameContext);
blobVision.formBlobs();
// striateVision.process();
ballVision.findBall();
goalVision.findBlueGoal();
goalVision.findYellowGoal();
robotVision.findRedNao();
robotVision.findBlueNao();
if (context.getParam(USE_HOUGH))
houghVision.process();
fireUpdateVision();
}
@Override
public void stop() {
}
private void updateContext(VisualFrameContext context) {
blobVision.setVisualFrameContext(context);
ballVision.setVisualFrameContext(context);
goalVision.setVisualFrameContext(context);
robotVision.setVisualFrameContext(context);
generalVision.setVisualFrameContext(context);
houghVision.setVisualFrameContext(context);
}
public void clear() {
for (VisualObject vo : map.values()) {
vo.clear();
}
}
public void addEventListener(VisualEventListener listener) {
listeners.add(listener);
}
public void removeEventListener(VisualEventListener listener) {
listeners.remove(listener);
}
private void fireUpdateVision() {
for (VisualEventListener listener : listeners)
listener.updateVision(context);
}
public void setGCD(GCD gcd) {
this.gcd = gcd;
}
public void setParam(VisualParam.Boolean key, boolean value) {
context.setParam(key, value);
}
public void setParam(VisualParam.Float key, float value) {
context.setParam(key, value);
}
public void setParam(VisualParam.Int key, int value) {
context.setParam(key, value);
}
}