cvwimage.h
上传用户:soukeisyuu
上传日期:2022-07-03
资源大小:5943k
文件大小:20k
源码类别:

波变换

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  3. //
  4. //  By downloading, copying, installing or using the software you agree to 
  5. //  this license.  If you do not agree to this license, do not download, 
  6. //  install, copy or use the software.
  7. //
  8. //                           License Agreement
  9. //                For Open Source Computer Vision Library
  10. //
  11. // Copyright (C) 2008, Google, all rights reserved.
  12. // Third party copyrights are property of their respective owners.
  13. //
  14. // Redistribution and use in source and binary forms, with or without 
  15. // modification, are permitted provided that the following conditions are met:
  16. //
  17. //  * Redistribution's of source code must retain the above copyright notice,
  18. //     this list of conditions and the following disclaimer.
  19. //
  20. //  * Redistribution's in binary form must reproduce the above copyright notice,
  21. //     this list of conditions and the following disclaimer in the documentation
  22. //     and/or other materials provided with the distribution.
  23. //
  24. //  * The name of Intel Corporation or contributors may not be used to endorse
  25. //     or promote products derived from this software without specific
  26. //     prior written permission.
  27. //
  28. // This software is provided by the copyright holders and contributors "as is" 
  29. // and any express or implied warranties, including, but not limited to, the 
  30. // implied warranties of merchantability and fitness for a particular purpose 
  31. // are disclaimed. In no event shall the Intel Corporation or contributors be 
  32. // liable for any direct, indirect, incidental, special, exemplary, or 
  33. // consequential damages
  34. // (including, but not limited to, procurement of substitute goods or services;
  35. // loss of use, data, or profits; or business interruption) however caused
  36. // and on any theory of liability, whether in contract, strict liability,
  37. // or tort (including negligence or otherwise) arising in any way out of
  38. // the use of this software, even if advised of the possibility of such damage.
  39. /////////////////////////////////////////////////////////////////////////////////
  40. //
  41. // Image class which provides a thin layer around an IplImage.  The goals
  42. // of the class design are:
  43. //    1. All the data has explicit ownership to avoid memory leaks
  44. //    2. No hidden allocations or copies for performance.
  45. //    3. Easy access to OpenCV methods (which will access IPP if available)
  46. //    4. Can easily treat external data as an image
  47. //    5. Easy to create images which are subsets of other images
  48. //    6. Fast pixel access which can take advantage of number of channels
  49. //          if known at compile time.
  50. //
  51. // The WImage class is the image class which provides the data accessors.
  52. // The 'W' comes from the fact that it is also a wrapper around the popular
  53. // but inconvenient IplImage class. A WImage can be constructed either using a
  54. // WImageBuffer class which allocates and frees the data,
  55. // or using a WImageView class which constructs a subimage or a view into
  56. // external data.  The view class does no memory management.  Each class
  57. // actually has two versions, one when the number of channels is known at
  58. // compile time and one when it isn't.  Using the one with the number of
  59. // channels specified can provide some compile time optimizations by using the
  60. // fact that the number of channels is a constant.
  61. //
  62. // We use the convention (c,r) to refer to column c and row r with (0,0) being
  63. // the upper left corner.  This is similar to standard Euclidean coordinates
  64. // with the first coordinate varying in the horizontal direction and the second
  65. // coordinate varying in the vertical direction.
  66. // Thus (c,r) is usually in the domain [0, width) X [0, height)
  67. //
  68. // Example usage:
  69. // WImageBuffer3_b  im(5,7);  // Make a 5X7 3 channel image of type uchar
  70. // WImageView3_b  sub_im(im, 2,2, 3,3); // 3X3 submatrix
  71. // vector<float> vec(10, 3.0f);
  72. // WImageView1_f user_im(&vec[0], 2, 5);  // 2X5 image w/ supplied data
  73. //
  74. // im.SetZero();  // same as cvSetZero(im.Ipl())
  75. // *im(2, 3) = 15;  // Modify the element at column 2, row 3
  76. // MySetRand(&sub_im);
  77. //
  78. // // Copy the second row into the first.  This can be done with no memory
  79. // // allocation and will use SSE if IPP is available.
  80. // int w = im.Width();
  81. // im.View(0,0, w,1).CopyFrom(im.View(0,1, w,1));
  82. //
  83. // // Doesn't care about source of data since using WImage
  84. // void MySetRand(WImage_b* im) { // Works with any number of channels
  85. //   for (int r = 0; r < im->Height(); ++r) {
  86. //     float* row = im->Row(r);
  87. //     for (int c = 0; c < im->Width(); ++c) {
  88. //        for (int ch = 0; ch < im->Channels(); ++ch, ++row) {
  89. //          *row = uchar(rand() & 255);
  90. //        }
  91. //     }
  92. //   }
  93. // }
  94. //
  95. // Functions that are not part of the basic image allocation, viewing, and
  96. // access should come from OpenCV, except some useful functions that are not
  97. // part of OpenCV can be found in wimage_util.h
  98. #ifndef _CV_WIMAGE_H_
  99. #define _CV_WIMAGE_H_
  100. #include "cxcore.h"
  101. #ifdef __cplusplus
  102. namespace cv {
  103. template <typename T> class WImage;
  104. template <typename T> class WImageBuffer;
  105. template <typename T> class WImageView;
  106. template<typename T, int C> class WImageC;
  107. template<typename T, int C> class WImageBufferC;
  108. template<typename T, int C> class WImageViewC;
  109. // Commonly used typedefs.
  110. typedef WImage<uchar>            WImage_b;
  111. typedef WImageView<uchar>        WImageView_b;
  112. typedef WImageBuffer<uchar>      WImageBuffer_b;
  113. typedef WImageC<uchar, 1>        WImage1_b;
  114. typedef WImageViewC<uchar, 1>    WImageView1_b;
  115. typedef WImageBufferC<uchar, 1>  WImageBuffer1_b;
  116. typedef WImageC<uchar, 3>        WImage3_b;
  117. typedef WImageViewC<uchar, 3>    WImageView3_b;
  118. typedef WImageBufferC<uchar, 3>  WImageBuffer3_b;
  119. typedef WImage<float>            WImage_f;
  120. typedef WImageView<float>        WImageView_f;
  121. typedef WImageBuffer<float>      WImageBuffer_f;
  122. typedef WImageC<float, 1>        WImage1_f;
  123. typedef WImageViewC<float, 1>    WImageView1_f;
  124. typedef WImageBufferC<float, 1>  WImageBuffer1_f;
  125. typedef WImageC<float, 3>        WImage3_f;
  126. typedef WImageViewC<float, 3>    WImageView3_f;
  127. typedef WImageBufferC<float, 3>  WImageBuffer3_f;
  128. // There isn't a standard for signed and unsigned short so be more
  129. // explicit in the typename for these cases.
  130. typedef WImage<short>            WImage_16s;
  131. typedef WImageView<short>        WImageView_16s;
  132. typedef WImageBuffer<short>      WImageBuffer_16s;
  133. typedef WImageC<short, 1>        WImage1_16s;
  134. typedef WImageViewC<short, 1>    WImageView1_16s;
  135. typedef WImageBufferC<short, 1>  WImageBuffer1_16s;
  136. typedef WImageC<short, 3>        WImage3_16s;
  137. typedef WImageViewC<short, 3>    WImageView3_16s;
  138. typedef WImageBufferC<short, 3>  WImageBuffer3_16s;
  139. typedef WImage<ushort>            WImage_16u;
  140. typedef WImageView<ushort>        WImageView_16u;
  141. typedef WImageBuffer<ushort>      WImageBuffer_16u;
  142. typedef WImageC<ushort, 1>        WImage1_16u;
  143. typedef WImageViewC<ushort, 1>    WImageView1_16u;
  144. typedef WImageBufferC<ushort, 1>  WImageBuffer1_16u;
  145. typedef WImageC<ushort, 3>        WImage3_16u;
  146. typedef WImageViewC<ushort, 3>    WImageView3_16u;
  147. typedef WImageBufferC<ushort, 3>  WImageBuffer3_16u;
  148. //
  149. // WImage definitions
  150. //
  151. // This WImage class gives access to the data it refers to.  It can be
  152. // constructed either by allocating the data with a WImageBuffer class or
  153. // using the WImageView class to refer to a subimage or outside data.
  154. template<typename T>
  155. class WImage
  156. {
  157. public:
  158.     typedef T BaseType;
  159.     // WImage is an abstract class with no other virtual methods so make the
  160.     // destructor virtual.
  161.     virtual ~WImage() = 0;
  162.     // Accessors
  163.     IplImage* Ipl() {return image_; }
  164.     const IplImage* Ipl() const {return image_; }
  165.     T* ImageData() { return reinterpret_cast<T*>(image_->imageData); }
  166.     const T* ImageData() const {
  167.         return reinterpret_cast<const T*>(image_->imageData);
  168.     }
  169.     int Width() const {return image_->width; }
  170.     int Height() const {return image_->height; }
  171.     // WidthStep is the number of bytes to go to the pixel with the next y coord
  172.     int WidthStep() const {return image_->widthStep; }
  173.     int Channels() const {return image_->nChannels; }
  174.     int ChannelSize() const {return sizeof(T); }  // number of bytes per channel
  175.     // Number of bytes per pixel
  176.     int PixelSize() const {return Channels() * ChannelSize(); }
  177.     // Return depth type (e.g. IPL_DEPTH_8U, IPL_DEPTH_32F) which is the number
  178.     // of bits per channel and with the signed bit set.
  179.     // This is known at compile time using specializations.
  180.     int Depth() const;
  181.     inline const T* Row(int r) const {
  182.         return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep);
  183.     }
  184.     inline T* Row(int r) {
  185.         return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep);
  186.     }
  187.     // Pixel accessors which returns a pointer to the start of the channel
  188.     inline T* operator() (int c, int r)  {
  189.         return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep) +
  190.             c*Channels();
  191.     }
  192.     inline const T* operator() (int c, int r) const  {
  193.         return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep) +
  194.             c*Channels();
  195.     }
  196.     // Copy the contents from another image which is just a convenience to cvCopy
  197.     void CopyFrom(const WImage<T>& src) { cvCopy(src.Ipl(), image_); }
  198.     // Set contents to zero which is just a convenient to cvSetZero
  199.     void SetZero() { cvSetZero(image_); }
  200.     // Construct a view into a region of this image
  201.     WImageView<T> View(int c, int r, int width, int height);
  202. protected:
  203.     // Disallow copy and assignment
  204.     WImage(const WImage&);
  205.     void operator=(const WImage&);
  206.     explicit WImage(IplImage* img) : image_(img) {
  207.         assert(!img || img->depth == Depth());
  208.     }
  209.     void SetIpl(IplImage* image) {
  210.         assert(!image || image->depth == Depth());
  211.         image_ = image;
  212.     }
  213.     IplImage* image_;
  214. };
  215. // Image class when both the pixel type and number of channels
  216. // are known at compile time.  This wrapper will speed up some of the operations
  217. // like accessing individual pixels using the () operator.
  218. template<typename T, int C>
  219. class WImageC : public WImage<T>
  220. {
  221. public:
  222.     typedef typename WImage<T>::BaseType BaseType;
  223.     enum { kChannels = C };
  224.     explicit WImageC(IplImage* img) : WImage<T>(img) {
  225.         assert(!img || img->nChannels == Channels());
  226.     }
  227.     // Construct a view into a region of this image
  228.     WImageViewC<T, C> View(int c, int r, int width, int height);
  229.     // Copy the contents from another image which is just a convenience to cvCopy
  230.     void CopyFrom(const WImageC<T, C>& src) {
  231.         cvCopy(src.Ipl(), WImage<T>::image_);
  232.     }
  233.     // WImageC is an abstract class with no other virtual methods so make the
  234.     // destructor virtual.
  235.     virtual ~WImageC() = 0;
  236.     int Channels() const {return C; }
  237. protected:
  238.     // Disallow copy and assignment
  239.     WImageC(const WImageC&);
  240.     void operator=(const WImageC&);
  241.     void SetIpl(IplImage* image) {
  242.         assert(!image || image->depth == WImage<T>::Depth());
  243.         WImage<T>::SetIpl(image);
  244.     }
  245. };
  246. //
  247. // WImageBuffer definitions
  248. //
  249. // Image class which owns the data, so it can be allocated and is always
  250. // freed.  It cannot be copied but can be explicity cloned.
  251. //
  252. template<typename T>
  253. class WImageBuffer : public WImage<T>
  254. {
  255. public:
  256.     typedef typename WImage<T>::BaseType BaseType;
  257.     // Default constructor which creates an object that can be
  258.     WImageBuffer() : WImage<T>(0) {}
  259.     WImageBuffer(int width, int height, int nchannels) : WImage<T>(0) {
  260.         Allocate(width, height, nchannels);
  261.     }
  262.     // Constructor which takes ownership of a given IplImage so releases
  263.     // the image on destruction.
  264.     explicit WImageBuffer(IplImage* img) : WImage<T>(img) {}
  265.     // Allocate an image.  Does nothing if current size is the same as
  266.     // the new size.
  267.     void Allocate(int width, int height, int nchannels);
  268.     // Set the data to point to an image, releasing the old data
  269.     void SetIpl(IplImage* img) {
  270.         ReleaseImage();
  271.         WImage<T>::SetIpl(img);
  272.     }
  273.     // Clone an image which reallocates the image if of a different dimension.
  274.     void CloneFrom(const WImage<T>& src) {
  275.         Allocate(src.Width(), src.Height(), src.Channels());
  276.         CopyFrom(src);
  277.     }
  278.     ~WImageBuffer() {
  279.         ReleaseImage();
  280.     }
  281.     // Release the image if it isn't null.
  282.     void ReleaseImage() {
  283.         if (WImage<T>::image_) {
  284.             IplImage* image = WImage<T>::image_;
  285.             cvReleaseImage(&image);
  286.             WImage<T>::SetIpl(0);
  287.         }
  288.     }
  289.     bool IsNull() const {return WImage<T>::image_ == NULL; }
  290. private:
  291.     // Disallow copy and assignment
  292.     WImageBuffer(const WImageBuffer&);
  293.     void operator=(const WImageBuffer&);
  294. };
  295. // Like a WImageBuffer class but when the number of channels is known
  296. // at compile time.
  297. template<typename T, int C>
  298. class WImageBufferC : public WImageC<T, C>
  299. {
  300. public:
  301.     typedef typename WImage<T>::BaseType BaseType;
  302.     enum { kChannels = C };
  303.     // Default constructor which creates an object that can be
  304.     WImageBufferC() : WImageC<T, C>(0) {}
  305.     WImageBufferC(int width, int height) : WImageC<T, C>(0) {
  306.         Allocate(width, height);
  307.     }
  308.     // Constructor which takes ownership of a given IplImage so releases
  309.     // the image on destruction.
  310.     explicit WImageBufferC(IplImage* img) : WImageC<T, C>(img) {}
  311.     // Allocate an image.  Does nothing if current size is the same as
  312.     // the new size.
  313.     void Allocate(int width, int height);
  314.     // Set the data to point to an image, releasing the old data
  315.     void SetIpl(IplImage* img) {
  316.         ReleaseImage();
  317.         WImageC<T, C>::SetIpl(img);
  318.     }
  319.     // Clone an image which reallocates the image if of a different dimension.
  320.     void CloneFrom(const WImageC<T, C>& src) {
  321.         Allocate(src.Width(), src.Height());
  322.         CopyFrom(src);
  323.     }
  324.     ~WImageBufferC() {
  325.         ReleaseImage();
  326.     }
  327.     // Release the image if it isn't null.
  328.     void ReleaseImage() {
  329.         if (WImage<T>::image_) {
  330.             IplImage* image = WImage<T>::image_;
  331.             cvReleaseImage(&image);
  332.             WImageC<T, C>::SetIpl(0);
  333.         }
  334.     }
  335.     bool IsNull() const {return WImage<T>::image_ == NULL; }
  336. private:
  337.     // Disallow copy and assignment
  338.     WImageBufferC(const WImageBufferC&);
  339.     void operator=(const WImageBufferC&);
  340. };
  341. //
  342. // WImageView definitions
  343. //
  344. // View into an image class which allows treating a subimage as an image
  345. // or treating external data as an image
  346. //
  347. template<typename T>
  348. class WImageView : public WImage<T>
  349. {
  350. public:
  351.     typedef typename WImage<T>::BaseType BaseType;
  352.     // Construct a subimage.  No checks are done that the subimage lies
  353.     // completely inside the original image.
  354.     WImageView(WImage<T>* img, int c, int r, int width, int height);
  355.     // Refer to external data.
  356.     // If not given width_step assumed to be same as width.
  357.     WImageView(T* data, int width, int height, int channels, int width_step = -1);
  358.     // Refer to external data.  This does NOT take ownership
  359.     // of the supplied IplImage.
  360.     WImageView(IplImage* img) : WImage<T>(img) {}
  361.     // Copy constructor
  362.     WImageView(const WImage<T>& img) : WImage<T>(0) {
  363.         header_ = *(img.Ipl());
  364.         WImage<T>::SetIpl(&header_);
  365.     }
  366.     WImageView& operator=(const WImage<T>& img) {
  367.         header_ = *(img.Ipl());
  368.         WImage<T>::SetIpl(&header_);
  369.         return *this;
  370.     }
  371. protected:
  372.     IplImage header_;
  373. };
  374. template<typename T, int C>
  375. class WImageViewC : public WImageC<T, C>
  376. {
  377. public:
  378.     typedef typename WImage<T>::BaseType BaseType;
  379.     enum { kChannels = C };
  380.     // Default constructor needed for vectors of views.
  381.     WImageViewC();
  382.     virtual ~WImageViewC() {}
  383.     // Construct a subimage.  No checks are done that the subimage lies
  384.     // completely inside the original image.
  385.     WImageViewC(WImageC<T, C>* img,
  386.         int c, int r, int width, int height);
  387.     // Refer to external data
  388.     WImageViewC(T* data, int width, int height, int width_step = -1);
  389.     // Refer to external data.  This does NOT take ownership
  390.     // of the supplied IplImage.
  391.     WImageViewC(IplImage* img) : WImageC<T, C>(img) {}
  392.     // Copy constructor which does a shallow copy to allow multiple views
  393.     // of same data.  gcc-4.1.1 gets confused if both versions of
  394.     // the constructor and assignment operator are not provided.
  395.     WImageViewC(const WImageC<T, C>& img) : WImageC<T, C>(0) {
  396.         header_ = *(img.Ipl());
  397.         WImageC<T, C>::SetIpl(&header_);
  398.     }
  399.     WImageViewC(const WImageViewC<T, C>& img) : WImageC<T, C>(0) {
  400.         header_ = *(img.Ipl());
  401.         WImageC<T, C>::SetIpl(&header_);
  402.     }
  403.     WImageViewC& operator=(const WImageC<T, C>& img) {
  404.         header_ = *(img.Ipl());
  405.         WImageC<T, C>::SetIpl(&header_);
  406.         return *this;
  407.     }
  408.     WImageViewC& operator=(const WImageViewC<T, C>& img) {
  409.         header_ = *(img.Ipl());
  410.         WImageC<T, C>::SetIpl(&header_);
  411.         return *this;
  412.     }
  413. protected:
  414.     IplImage header_;
  415. };
  416. // Specializations for depth
  417. template<>
  418. inline int WImage<uchar>::Depth() const {return IPL_DEPTH_8U; }
  419. template<>
  420. inline int WImage<signed char>::Depth() const {return IPL_DEPTH_8S; }
  421. template<>
  422. inline int WImage<short>::Depth() const {return IPL_DEPTH_16S; }
  423. template<>
  424. inline int WImage<ushort>::Depth() const {return IPL_DEPTH_16U; }
  425. template<>
  426. inline int WImage<int>::Depth() const {return IPL_DEPTH_32S; }
  427. template<>
  428. inline int WImage<float>::Depth() const {return IPL_DEPTH_32F; }
  429. template<>
  430. inline int WImage<double>::Depth() const {return IPL_DEPTH_64F; }
  431. //
  432. // Pure virtual destructors still need to be defined.
  433. //
  434. template<typename T> inline WImage<T>::~WImage() {}
  435. template<typename T, int C> inline WImageC<T, C>::~WImageC() {}
  436. //
  437. // Allocate ImageData
  438. //
  439. template<typename T>
  440. inline void WImageBuffer<T>::Allocate(int width, int height, int nchannels)
  441. {
  442.     if (IsNull() || WImage<T>::Width() != width ||
  443.         WImage<T>::Height() != height || WImage<T>::Channels() != nchannels) {
  444.         ReleaseImage();
  445.         WImage<T>::image_ = cvCreateImage(cvSize(width, height),
  446.             WImage<T>::Depth(), nchannels);
  447.     }
  448. }
  449. template<typename T, int C>
  450. inline void WImageBufferC<T, C>::Allocate(int width, int height)
  451. {
  452.     if (IsNull() || WImage<T>::Width() != width || WImage<T>::Height() != height) {
  453.         ReleaseImage();
  454.         WImageC<T, C>::SetIpl(cvCreateImage(cvSize(width, height),WImage<T>::Depth(), C));
  455.     }
  456. }
  457. //
  458. // ImageView methods
  459. //
  460. template<typename T>
  461. WImageView<T>::WImageView(WImage<T>* img, int c, int r, int width, int height)
  462.         : WImage<T>(0)
  463. {
  464.     header_ = *(img->Ipl());
  465.     header_.imageData = reinterpret_cast<char*>((*img)(c, r));
  466.     header_.width = width;
  467.     header_.height = height;
  468.     WImage<T>::SetIpl(&header_);
  469. }
  470. template<typename T>
  471. WImageView<T>::WImageView(T* data, int width, int height, int nchannels, int width_step)
  472.           : WImage<T>(0)
  473. {
  474.     cvInitImageHeader(&header_, cvSize(width, height), WImage<T>::Depth(), nchannels);
  475.     header_.imageData = reinterpret_cast<char*>(data);
  476.     if (width_step > 0) {
  477.         header_.widthStep = width_step;
  478.     }
  479.     WImage<T>::SetIpl(&header_);
  480. }
  481. template<typename T, int C>
  482. WImageViewC<T, C>::WImageViewC(WImageC<T, C>* img, int c, int r, int width, int height)
  483.         : WImageC<T, C>(0)
  484. {
  485.     header_ = *(img->Ipl());
  486.     header_.imageData = reinterpret_cast<char*>((*img)(c, r));
  487.     header_.width = width;
  488.     header_.height = height;
  489.     WImageC<T, C>::SetIpl(&header_);
  490. }
  491. template<typename T, int C>
  492. WImageViewC<T, C>::WImageViewC() : WImageC<T, C>(0) {
  493.     cvInitImageHeader(&header_, cvSize(0, 0), WImage<T>::Depth(), C);
  494.     header_.imageData = reinterpret_cast<char*>(0);
  495.     WImageC<T, C>::SetIpl(&header_);
  496. }
  497. template<typename T, int C>
  498. WImageViewC<T, C>::WImageViewC(T* data, int width, int height, int width_step)
  499.     : WImageC<T, C>(0)
  500. {
  501.     cvInitImageHeader(&header_, cvSize(width, height), WImage<T>::Depth(), C);
  502.     header_.imageData = reinterpret_cast<char*>(data);
  503.     if (width_step > 0) {
  504.         header_.widthStep = width_step;
  505.     }
  506.     WImageC<T, C>::SetIpl(&header_);
  507. }
  508. // Construct a view into a region of an image
  509. template<typename T>
  510. WImageView<T> WImage<T>::View(int c, int r, int width, int height) {
  511.     return WImageView<T>(this, c, r, width, height);
  512. }
  513. template<typename T, int C>
  514. WImageViewC<T, C> WImageC<T, C>::View(int c, int r, int width, int height) {
  515.     return WImageViewC<T, C>(this, c, r, width, height);
  516. }
  517. }  // end of namespace
  518. #endif // __cplusplus
  519. #endif  // _CV_WIMAGE_H_