thecakeisalie
19-03-2012, 18:18
Having finished writing the vision code, I tested our vision code. The only problem is that it did not seem to work. :(
if you can pinpoint our problem, it would be very helpful. This is my first year coding camera code in c++, so... i expect many things to go wrong :P
the vision.h:
#ifndef VISION_H
#define VISION_H
#include "WPILib.h"
class Vision {
private:
AxisCamera * camera;
public:
Vision();
int Height();
int Center_Mass();
double GetDistance(int h);
};
#endif
the vision.cpp:
#include "../Robotmap.h"
#include "Vision.h"
#include <math.h>
#define PI 3.14159265
Vision::Vision() {
camera ->GetInstance("10.02.93.15");
}
int Vision::Center_Mass()
{
ParticleFilterCriteria2 criteria[] = {
{IMAQ_MT_BOUNDING_RECT_WIDTH, 30, 400, false, false},
{IMAQ_MT_BOUNDING_RECT_HEIGHT, 40, 400, false, false}
};
ColorImage *image = camera->GetImage();
Threshold threshold(10, 255, 200, 255, 150, 255);
BinaryImage *thresholdImage = image->ThresholdRGB(threshold);
BinaryImage *bigObjectsImage = thresholdImage->RemoveSmallObjects(false, 2); // remove small objects (noise)
BinaryImage *convexHullImage = bigObjectsImage->ConvexHull(false); // fill in partial and full rectangles
BinaryImage *filteredImage = convexHullImage->ParticleFilter(criteria, 2); // find the rectangles
vector<ParticleAnalysisReport> *reports = filteredImage->GetOrderedParticleAnalysisReports(); // get the results
ParticleAnalysisReport *r = &(reports->at(1));
int center_mass_x = r->center_mass_x; // int, in pixels
delete reports;
delete filteredImage;
delete convexHullImage;
delete bigObjectsImage;
delete thresholdImage;
delete image;
return center_mass_x;
}
and the aiming part:
while (vision->Center_Mass() <159 || vision->Center_Mass() > 161){
while (vision->Center_Mass() < 159){
turret->DriveMotor(0.1);
if (vision->Center_Mass() > 159) break;
}
while (vision->Center_Mass() > 161){
turret->DriveMotor(-0.1);
if (vision->Center_Mass() < 161) break;
}
}
if you can pinpoint our problem, it would be very helpful. This is my first year coding camera code in c++, so... i expect many things to go wrong :P
the vision.h:
#ifndef VISION_H
#define VISION_H
#include "WPILib.h"
class Vision {
private:
AxisCamera * camera;
public:
Vision();
int Height();
int Center_Mass();
double GetDistance(int h);
};
#endif
the vision.cpp:
#include "../Robotmap.h"
#include "Vision.h"
#include <math.h>
#define PI 3.14159265
Vision::Vision() {
camera ->GetInstance("10.02.93.15");
}
int Vision::Center_Mass()
{
ParticleFilterCriteria2 criteria[] = {
{IMAQ_MT_BOUNDING_RECT_WIDTH, 30, 400, false, false},
{IMAQ_MT_BOUNDING_RECT_HEIGHT, 40, 400, false, false}
};
ColorImage *image = camera->GetImage();
Threshold threshold(10, 255, 200, 255, 150, 255);
BinaryImage *thresholdImage = image->ThresholdRGB(threshold);
BinaryImage *bigObjectsImage = thresholdImage->RemoveSmallObjects(false, 2); // remove small objects (noise)
BinaryImage *convexHullImage = bigObjectsImage->ConvexHull(false); // fill in partial and full rectangles
BinaryImage *filteredImage = convexHullImage->ParticleFilter(criteria, 2); // find the rectangles
vector<ParticleAnalysisReport> *reports = filteredImage->GetOrderedParticleAnalysisReports(); // get the results
ParticleAnalysisReport *r = &(reports->at(1));
int center_mass_x = r->center_mass_x; // int, in pixels
delete reports;
delete filteredImage;
delete convexHullImage;
delete bigObjectsImage;
delete thresholdImage;
delete image;
return center_mass_x;
}
and the aiming part:
while (vision->Center_Mass() <159 || vision->Center_Mass() > 161){
while (vision->Center_Mass() < 159){
turret->DriveMotor(0.1);
if (vision->Center_Mass() > 159) break;
}
while (vision->Center_Mass() > 161){
turret->DriveMotor(-0.1);
if (vision->Center_Mass() < 161) break;
}
}