00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #include "opencv2/imgproc/imgproc.hpp"
00022 #include <opencv/cv.h>
00023 #include <v4r_ellipses/v4r_ellipses.h>
00024 #include <v4r_ellipses/v4r_ellipses_defaults.h>
00025 #include <boost/foreach.hpp>
00026 
00027 using namespace V4R;
00028 
00029 void EllipsesDetection::draw_ellipses(cv::Mat &img) {
00030     std::vector<cv::Point2f> vtx(4);
00031     std::vector<cv::Point2f> vtxDis;
00032     cv::Scalar colourContour(255,0,255);
00033     cv::Scalar colourEllipse(0,0,255);
00034     char text[0xFF];
00035     for(unsigned int i = 0; i < ellipses_.size(); i++) {
00036         Ellipse &ellipse = ellipses_[i];
00037         if(ellipse.detection != VALID) continue;
00038         
00039         cv::RotatedRect box1, box2;
00040         camera_.distort(ellipse.boxEllipse, box1);
00041         cv::ellipse(img, box1, colourEllipse, 1, CV_AA);
00042         camera_.distort(ellipses_[ellipse.innerRing].boxEllipse, box2);
00043         if(ellipse.innerRing >= 0) cv::ellipse(img, box2, colourEllipse, 1, CV_AA);
00044         box1.points(&vtx[0]);
00045         for( int j = 0; j < 4; j++ ) {
00046             cv::line(img, vtx[j], vtx[(j+2)%4], cv::Scalar(0,255,0), 1, CV_AA);
00047             sprintf(text, "%i", j);
00048             
00049         }
00050         camera_.distort(*ellipse.contourUndistort, vtxDis);
00051         BOOST_FOREACH(const cv::Point2f &p, vtxDis ) {
00052             img.at<cv::Vec3b>(p) = cv::Vec3b(0,255,255);
00053         }
00054 
00055         
00056         if(ellipse.cone.projections[0] != cv::Point2d(0,0)) {
00057             for(unsigned int k = 0; k < 2; k++) {
00058                 cv::Mat pi, pw(ellipse.cone.translations[k]);
00059                 cv::Mat pin , pn = pw + cv::Mat(ellipse.cone.normals[k])*param_->circle_diameter;
00060                 cv::projectPoints(pw.t(), cv::Mat_<double>::zeros(1,3), cv::Mat_<double>::zeros(1,3), camera_.cameraMatrix, camera_.distCoeffs, pi);
00061                 cv::projectPoints(pn.t(), cv::Mat_<double>::zeros(1,3), cv::Mat_<double>::zeros(1,3), camera_.cameraMatrix, camera_.distCoeffs, pin);
00062                 for(int j = 0; j < pi.rows; j++) {
00063                     cv::Point p0(pi.at<double>(j,0),pi.at<double>(j,1));
00064                     cv::circle(img, p0,2, cv::Scalar(125*j,125*j,255));
00065                     cv::Point p1(pin.at<double>(j,0),pin.at<double>(j,1));
00066                     cv::line(img, p0, p1, cv::Scalar(125*j,125*j,255), 1, CV_AA);
00067                 }
00068             }
00069         }
00070 
00072         if(param_->debug) {
00073             std::cout << "% === " << std::setw(4) <<  loop_count;
00074             std::cout << "  ===== ellipse " << std::setw(4) << i << " ===" << std::endl;
00075             std::cout << "ellipse.center     = " <<  ellipse.boxEllipse.center << "; " << std::endl;
00076             std::cout << "ellipse.size       = " <<  (cv::Point2f) ellipse.boxEllipse.size << "; " << std::endl;
00077             std::cout << "ellipse.angle      = " <<   M_PI/180.0 *ellipse.boxEllipse.angle << "; " << std::endl;
00078             std::cout << "ellipse.C          = " << ellipse.cone.C << "; " << "  % Ellipse Image" << std::endl;
00079             std::cout << "ellipse.radius     = " << param_->circle_diameter/2. << "; " << std::endl;
00080             std::cout << "ellipse.nr_of_edges=" <<  ellipse.contourUndistort->size() << "; " << std::endl;
00081             std::cout << "ellipse.contour    = " << cv::Mat(*ellipse.contourUndistort) << "; " << std::endl;
00082             std::cout << "camera.intrinsic   = " << camera_.cameraMatrix << "; " << std::endl;
00083             std::cout << "camera.distortions = " << camera_.distCoeffs << "; " << std::endl;
00084             std::cout << "camera.projectionMatrix = " << camera_.projectionMatrix << "; " << std::endl;
00085         }
00086     }
00087     if(param_->debug) {
00088         contour_detector_.Draw(img.data);
00089     }
00090 }