10#include <yarp/cv/Cv.h> 
   11#include <iCub/SphericalCalibTool.h> 
   15using namespace yarp::os;
 
   16using namespace yarp::sig;
 
   17using namespace yarp::cv;
 
   22    _oldImgSize.width = -1;
 
   23    _oldImgSize.height = -1;
 
   37        cvReleaseImage(&_mapX);
 
   40        cvReleaseImage(&_mapY);
 
   47    fprintf(stdout,
"There seem to be an error loading parameters \"%s\", stopping module\n", val.c_str());
 
   53    _calibImgSize.width = config.check(
"w",
 
   55                                      "Image width for which calibration parameters were calculated (int)").asInt32();
 
   56    _calibImgSize.height = config.check(
"h",
 
   58                                      "Image height for which calibration parameters were calculated (int)").asInt32();
 
   59    _drawCenterCross = config.check(
"drawCenterCross",
 
   61                                    "Draw a cross at calibration center (int [0|1]).").asInt32()!=0;
 
   63    _fx = config.check(
"fx", Value(320.0), 
"Focal distance (on horizontal pixel size units) (double)").asFloat64();
 
   64    _fy = config.check(
"fy", Value(240.0), 
"Focal distance (on vertical pixel size units) (double)").asFloat64();
 
   65    _cx = config.check(
"cx", Value(320.0), 
"Image center (on horizontal pixel size units) (double)").asFloat64();
 
   66    _cy = config.check(
"cy", Value(240.0), 
"Image center (on vertical pixel size units) (double)").asFloat64();
 
   67    _k1 = config.check(
"k1", Value(0.0), 
"Radial distortion (first parameter) (double)").asFloat64();
 
   68    _k2 = config.check(
"k2", Value(0.0), 
"Radial distortion (second parameter) (double)").asFloat64();
 
   69    _p1 = config.check(
"p1", Value(0.0), 
"Tangential distortion (first parameter) (double)").asFloat64();
 
   70    _p2 = config.check(
"p2", Value(0.0), 
"Tangential distortion (second parameter) (double)").asFloat64();
 
   73    if ( !config.check(
"drawCenterCross") ) { 
stopConfig(
"drawCenterCross"); 
return false; }
 
   74    if ( !config.check(
"w") ) { 
stopConfig(
"w"); 
return false;}
 
   75    if ( !config.check(
"h") ) { 
stopConfig(
"h"); 
return false;}
 
   76    if ( !config.check(
"fx") ) { 
stopConfig(
"fx"); 
return false;}
 
   77    if ( !config.check(
"fy") ) { 
stopConfig(
"fy"); 
return false;}
 
   78    if ( !config.check(
"cx") ) { 
stopConfig(
"cx"); 
return false;}
 
   79    if ( !config.check(
"cy") ) { 
stopConfig(
"cy"); 
return false;}
 
   80    if ( !config.check(
"k1") ) { 
stopConfig(
"k1"); 
return false;}
 
   81    if ( !config.check(
"k2") ) { 
stopConfig(
"k2"); 
return false;}
 
   82    if ( !config.check(
"p1") ) { 
stopConfig(
"p1"); 
return false;}
 
   83    if ( !config.check(
"p2") ) { 
stopConfig(
"p2"); 
return false;}
 
   96bool SphericalCalibTool::init(CvSize currImgSize, CvSize calibImgSize){
 
   99        cvReleaseImage(&_mapX);
 
  102        cvReleaseImage(&_mapY);
 
  109    if (currImgSize.width != calibImgSize.width ||
 
  110        currImgSize.height != calibImgSize.height){
 
  111        float scaleX = (float)currImgSize.width / (
float)calibImgSize.width;
 
  112        float scaleY = (float)currImgSize.height / (
float)calibImgSize.height;
 
  113        _fx_scaled = _fx * scaleX;
 
  114        _fy_scaled = _fy * scaleY;
 
  115        _cx_scaled = _cx * scaleX;
 
  116        _cy_scaled = _cy * scaleY;
 
  125    _mapX = cvCreateImage(currImgSize, IPL_DEPTH_32F, 1);
 
  126    _mapY = cvCreateImage(currImgSize, IPL_DEPTH_32F, 1);
 
  131                       currImgSize.height, currImgSize.width,
 
  132                        _fx_scaled, _fy_scaled, _cx_scaled, _cy_scaled,
 
  134                        (
float*)_mapX->imageData, (
float*)_mapY->imageData))
 
  143    CvSize inSize = cvSize(in.width(),in.height());
 
  146    if ( inSize.width  != _oldImgSize.width ||
 
  147         inSize.height != _oldImgSize.height ||
 
  149        init(inSize,_calibImgSize);
 
  151    out.resize(inSize.width, inSize.height);
 
  153    cv::Mat outMat=toCvMat(
out);
 
  154    cv::remap( toCvMat(
const_cast<ImageOf<PixelRgb>&
>(in)), outMat,
 
  155               cv::cvarrToMat(_mapX), cv::cvarrToMat(_mapY),
 
  157    out=fromCvMat<PixelRgb>(outMat);
 
  160    if (_drawCenterCross){
 
  161        yarp::sig::PixelRgb pix = yarp::sig::PixelRgb(255,255,255);
 
  162        yarp::sig::draw::addCrossHair(
out, pix, (
int)_cx_scaled, (
int)_cy_scaled, 10);
 
  166    _oldImgSize.width  = inSize.width;
 
  167    _oldImgSize.height = inSize.height;
 
bool compute_sp_map(int input_lines, int input_cols, int output_lines, int output_cols, double fx, double fy, double cx, double cy, double k1, double k2, double p1, double p2, float *mapx, float *mapy)