Undistortion.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:5k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: Undistortion.cpp,v 1.8 2005/10/28 17:47:04 matz Exp $
  22. **/
  23. #include "Common.h"
  24. #include "Undistortion.h"
  25. #include "Exceptions.h"
  26. Undistortion::Undistortion()
  27. : m_can_undistort(false),
  28.   m_initialized(false),
  29.   m_undistort_data(NULL),
  30.   m_undist_img(NULL)
  31. {
  32.   m_camera.matrix[0]=-1;
  33. }
  34. Undistortion::~Undistortion()
  35. {
  36.   if (m_undist_img) cvReleaseImageData( m_undist_img );
  37.   if (m_undistort_data) cvReleaseImage( (IplImage**)&m_undistort_data );
  38. }
  39. void Undistortion::Initialize(int width, int height)
  40. {
  41.   if (m_undist_img) cvReleaseImageData( m_undist_img );
  42.   if (m_undistort_data) cvReleaseImage( (IplImage**)&m_undistort_data );
  43.   m_undist_img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
  44.   /* create data image for faster undistortion */
  45.   if (m_can_undistort) {
  46.     m_undistort_data = cvCreateImage(cvSize(width, height), IPL_DEPTH_32S, 3);
  47.     //    cvUnDistortInit( m_undist_img, m_undistort_data, m_camera.matrix,
  48.     //        m_camera.distortion );
  49.     // todo: fix for OpenCV 0.9.7
  50.   }
  51.   m_initialized = true;
  52. }
  53. bool Undistortion::CanUndistort() const
  54. {
  55.   return m_can_undistort;
  56. }
  57. void Undistortion::Load(string filename)
  58. {
  59. #define BUF_SIZE 10000
  60.   char buffer[BUF_SIZE + 100];
  61.   if(filename.size()) {
  62.     FILE *file = fopen(filename.c_str(), "rb");
  63.     if (file) {
  64.       int i, j, k;
  65.       float cameraMatrix[9];
  66.       float distortion[4];
  67.       int sz = (int) fread( buffer, 1, BUF_SIZE, file );
  68.       char* ptr = buffer;
  69.       buffer[sz] = '';
  70.       /* read matrix */
  71.       for( k = 0; k < 9; k++ )
  72.       {
  73.         ptr = strstr( ptr, "M[" );
  74.         if( ptr )
  75.         {
  76.           int s = 0;
  77.           ptr += 2;
  78.           if( sscanf( ptr, "%d%*[.,]%d%n", &i, &j, &s ) == 2 && i == k/3 && j == k%3 )
  79.           {
  80.             ptr += s;
  81.             ptr = strstr( ptr, "=" );
  82.             if( ptr )
  83.             {
  84.               s = 0;
  85.               ptr++;
  86.               if( sscanf( ptr, "%f%n", cameraMatrix + k, &s ) == 1 )
  87.               {
  88.                 ptr += s;
  89.                 continue;
  90.               }
  91.             }
  92.           }
  93.         }
  94.         /* else report a bug */
  95.         throw HVException("Invalid camera parameters file format");
  96.       }
  97.       /* read distortion */
  98.       for( k = 0; k < 4; k++ )
  99.       {
  100.         ptr = strstr( ptr, "D[" );
  101.         if( ptr )
  102.         {
  103.           int s = 0;
  104.           ptr += 2;
  105.           if( sscanf( ptr, "%d%n", &i, &s ) == 1 && i == k )
  106.           {
  107.             ptr += s;
  108.             ptr = strstr( ptr, "=" );
  109.             if( ptr )
  110.             {
  111.               s = 0;
  112.               ptr++;
  113.               if( sscanf( ptr, "%f%n", distortion + k, &s ) == 1 )
  114.               {
  115.                 ptr += s;
  116.                 continue;
  117.               }
  118.             }
  119.           }
  120.         }
  121.         /* else report a bug */
  122.         throw HVException("Invalid camera parameters file format");
  123.       }
  124.       memcpy( m_camera.matrix, cameraMatrix, sizeof( cameraMatrix ));
  125.       memcpy( m_camera.distortion, distortion, sizeof( distortion ));
  126.       m_camera.focalLength[0] = m_camera.matrix[0];
  127.       m_camera.focalLength[1] = m_camera.matrix[4];
  128.       m_camera.principalPoint[0] = m_camera.matrix[2];
  129.       m_camera.principalPoint[1] = m_camera.matrix[5];
  130.       m_can_undistort = true;
  131.       fclose(file);
  132.     }
  133.     else
  134.     {
  135.       throw HVException("Cannot open camera parameters file");
  136.     }
  137.   }
  138.   if (m_initialized) {
  139.     if (m_undistort_data) cvReleaseImage( (IplImage**)&m_undistort_data );
  140.     m_undistort_data = cvCreateImage(cvSize(m_undist_img->width, m_undist_img->height), IPL_DEPTH_32S, 3);
  141.     //cvUnDistortInit( m_undist_img, m_undistort_data, m_camera.matrix,
  142.     //  m_camera.distortion );
  143.     // todo: fix for OpenCV 0.9.7
  144.   }
  145. }
  146. void Undistortion::Undistort(IplImage* iplImage) const
  147. {
  148.   if (!m_initialized) {
  149.     throw HVException("Undistort not initialized");
  150.   }
  151.   if (!m_can_undistort) {
  152.     return;
  153.   }
  154.   throw HVException("Undistortion not fixed for OPenCV 0.9.7 yet");
  155.   //  cvUnDistort(iplImage, m_undist_img, m_undistort_data);
  156.   cvCopyImage(m_undist_img, iplImage);
  157. }
  158. void Undistortion::Undistort(IplImage* /*srcImg*/, IplImage* /*dstImg*/) const
  159. {
  160.   throw HVException("Undistort(src, dst) not implemented");
  161. }
  162.