summaryrefslogtreecommitdiff
path: root/src/vision.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vision.cpp')
-rw-r--r--src/vision.cpp53
1 files changed, 45 insertions, 8 deletions
diff --git a/src/vision.cpp b/src/vision.cpp
index 5d46f02..0f89b35 100644
--- a/src/vision.cpp
+++ b/src/vision.cpp
@@ -172,7 +172,22 @@ Vision::measurements ( const Camera &cam, const vector<measurement_t> &zin,
{
for (auto i=zin.begin(); i!=zin.end(); ++i) {
measurement_t z;
- measure(cam,*i, z);
+ z = *i;
+ if (i->z_type==MONO || i->z_type==BOTH) {
+ measurement_t zins, zouts;
+ zins = *i;
+ zins.z_type = MONO;
+ measure(cam,zins, zouts);
+ z.xcorrmax = zouts.xcorrmax;
+ z.source = zouts.source;
+ }
+ if (i->z_type==REFLECTION || i->z_type==BOTH) {
+ measurement_t zinr, zoutr;
+ zinr = *i;
+ zinr.z_type = REFLECTION;
+ measure(cam, zinr, zoutr);
+ z.reflection = zoutr.reflection;
+ }
if (z.xcorrmax>0.90)
zout.push_back(z);
}
@@ -189,6 +204,7 @@ Vision::measurements ( const Camera &cam, const vector<measurement_t> &zin,
void
Vision::measure ( const Camera &cam, const measurement_t &zin, measurement_t &zout )
{
+ assert((zin.z_type==MONO) || (zin.z_type==REFLECTION));
// Create ROIs
RotatedRect searchrr; // Rotated rect describing search ellipse
Rect searchr; // Rect describing search ellipse
@@ -206,7 +222,11 @@ Vision::measure ( const Camera &cam, const measurement_t &zin, measurement_t &zo
// Match template
Mat result;
result.create( sr.cols-zin.patch.cols+1, sr.rows-zin.patch.rows+1, CV_32FC1 );
- matchTemplate( sr, zin.patch, result, CV_TM_CCOEFF_NORMED);
+ if (zin.z_type==MONO) {
+ matchTemplate( sr, zin.patch, result, CV_TM_CCOEFF_NORMED);
+ } else {
+ matchTemplate( sr, zin.refpatch, result, CV_TM_CCOEFF_NORMED);
+ }
// Mask the ellipse around the result.
Mat mask = Mat::zeros(result.size(), CV_8UC1);
@@ -225,9 +245,17 @@ Vision::measure ( const Camera &cam, const measurement_t &zin, measurement_t &zo
Vector3d zi;
zi << zpi.x, zpi.y, 1;
- zout.source = cam.img2body(zi);
+ zout.id = zin.id;
+ if (zin.z_type==MONO) {
+ zout.source = cam.img2body(zi);
+ zout.z_type = MONO;
+ } else {
+ zout.reflection = cam.img2body(zi);
+ zout.z_type = REFLECTION;
+ }
zout.xcorrmax = maxval;
+ /*
Mat sr8, patch8, rpatch8;
sr.convertTo(sr8, CV_8UC1);
zin.patch.convertTo(patch8, CV_8UC1);
@@ -244,27 +272,36 @@ Vision::measure ( const Camera &cam, const measurement_t &zin, measurement_t &zo
cv::imshow("display2", display);
cerr << maxval << endl;
cv::waitKey(0);
+ */
} else {
zout.xcorrmax = -1.;
}
- zout.id = zin.id;
- zout.z_type = MONO;
return ;
} /* ----- end of method Vision::measure ----- */
void
Vision::searchRegion ( const Camera &cam, const measurement_t &z, cv::RotatedRect &rr )
{
+ assert((z.z_type==MONO) || (z.z_type==REFLECTION));
Vector3d xis;
- xis = cam.body2img(z.source);
+ if (z.z_type==MONO) {
+ xis = cam.body2img(z.source);
+ } else {
+ xis = cam.body2img(z.source);
+ }
//xis /= xis[2];
cv::Point ps;
ps.x = xis[0];
ps.y = xis[1];
double xs, ys;
- xs = 2*sqrt(z.Ssrc(0));
- ys = 2*sqrt(z.Ssrc(1));
+ if (z.z_type==MONO) {
+ xs = 2*sqrt(z.Ssrc(0));
+ ys = 2*sqrt(z.Ssrc(1));
+ } else {
+ xs = 2*sqrt(z.Sref(0));
+ ys = 2*sqrt(z.Sref(1));
+ }
// Create rotated rect for ellipse
rr = cv::RotatedRect(ps, cv::Size(2*INLIER_THRESHOLD*xs, 2*INLIER_THRESHOLD*ys), 0.);