LMDirectionalIntegralDistanceImage.h

00001 /*
00002 Copyright 2010, Ming-Yu Liu
00003 
00004 All Rights Reserved 
00005 
00006 Permission to use, copy, modify, and distribute this software and 
00007 its documentation for any non-commercial purpose is hereby granted 
00008 without fee, provided that the above copyright notice appear in 
00009 all copies and that both that copyright notice and this permission 
00010 notice appear in supporting documentation, and that the name of 
00011 the author not be used in advertising or publicity pertaining to 
00012 distribution of the software without specific, written prior 
00013 permission. 
00014 
00015 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 
00016 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
00017 ANY PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 
00018 ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
00019 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 
00020 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 
00021 OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
00022 */
00023 
00024 
00025 
00026 #pragma once
00027 #include <opencv/cxcore.h>
00028 
00029 
00030 class LMDirectionalIntegralDistanceImage
00031 {
00032 public:
00033         LMDirectionalIntegralDistanceImage();
00034         ~LMDirectionalIntegralDistanceImage();
00035 
00036         void CreateImage(int width, int height);
00037         void Construct(IplImage *image, float dx, float dy);
00038         inline float Sum(int x1, int y1, int x2, int y2, int& count);
00039 
00040 private:
00041         void SafeRelease();
00042         void ComputeIndices();
00043         void ComputeII(IplImage* image);
00044 
00045 
00046         IplImage *iimage_;
00047         float ds_;
00048         int xindexed_;
00049         int* indices_;
00050         float factor_;
00051         int width_;
00052         int height_;
00053 
00054         friend class LMDistanceImage;
00055 };
00056 
00057 
00058 inline float LMDirectionalIntegralDistanceImage::Sum(int x1, int y1, int x2, int y2, int& count)
00059 {
00060         double value = -1;
00061 
00062         if (xindexed_)
00063         {
00064                 if (x1 <= x2)
00065                 {
00066       int qy = y1+indices_[x2]-indices_[x1];
00067       int qx = x2;
00068       int qy1 = y1-indices_[x1]+indices_[x1-1];
00069       int qx1 = x1-1;
00070 
00071       if (qy >= 0 &&
00072           qy < height_ &&
00073           qx >= 0 &&
00074           qx < width_ &&
00075           qy1 >= 0 &&
00076           qy1 < height_ &&
00077           qx1 >= 0 &&
00078           qx1 < width_ )
00079       {
00080         value = 
00081           + cvGetReal2D(iimage_,qy, qx)
00082           - cvGetReal2D(iimage_,qy1, qx1);
00083       } else {
00084         value = -1; //width_*height_;
00085       }
00086                                 
00087                         count = x2-x1+1;
00088                 }
00089                 else
00090                 {
00091       int qy = y2+indices_[x1]-indices_[x2];
00092       int qx = x1;
00093       int qy1 = y2-indices_[x2]+indices_[x2-1];
00094       int qx1 = x2-1;
00095       if (qy >= 0 &&
00096           qy < height_ &&
00097           qx >= 0 &&
00098           qx < width_ &&
00099           qy1 >= 0 &&
00100           qy1 < height_ &&
00101           qx1 >= 0 &&
00102           qx1 < width_ )
00103       {
00104                         value = 
00105                                 + cvGetReal2D(iimage_, qy, qx)
00106                                 - cvGetReal2D(iimage_, qy1, qx1);                       
00107                         count = x1-x2+1;
00108       } else {
00109         value = -1; //width_*height_;
00110       }
00111                 }
00112 
00113         }
00114         else
00115         {
00116                 if (y1 <= y2)
00117                 {
00118       int qy = y2;
00119       int qx =x1+indices_[y2]-indices_[y1];
00120       int qy1 = y1-1;
00121       int qx1 = x1-indices_[y1]+indices_[y1-1];
00122       if (qy >= 0 &&
00123           qy < height_ &&
00124           qx >= 0 &&
00125           qx < width_ &&
00126           qy1 >= 0 &&
00127           qy1 < height_ &&
00128           qx1 >= 0 &&
00129           qx1 < width_ )
00130       {
00131                         value = 
00132                                 + cvGetReal2D(iimage_, qy, qx)
00133                                 - cvGetReal2D(iimage_, qy1, qx1);
00134       } else {
00135         value = -1; //width_*height_;
00136       }
00137                         
00138                         count = y2-y1+1;
00139 
00140                 }
00141                 else
00142                 {
00143       int qy = y1;
00144       int qx =x2+indices_[y1]-indices_[y2];
00145       int qy1 = y2-1;
00146       int qx1 = x2-indices_[y2]+indices_[y2-1];
00147       if (qy >= 0 &&
00148           qy < height_ &&
00149           qx >= 0 &&
00150           qx < width_ &&
00151           qy1 >= 0 &&
00152           qy1 < height_ &&
00153           qx1 >= 0 &&
00154           qx1 < width_ )
00155       {
00156                         value = 
00157                                 + cvGetReal2D(iimage_, qy, qx)
00158                                 - cvGetReal2D(iimage_, qy1, qx1);
00159       } else {
00160         value = -1; //width_*height_;
00161       }
00162                         
00163                         count = y1-y2+1;
00164 
00165                 }               
00166         }
00167 
00168         return (float)(value*factor_);
00169 }
Generated on Sun May 8 08:41:09 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3