123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603 |
- #ifndef OPENCV_CORE_WIMAGE_HPP
- #define OPENCV_CORE_WIMAGE_HPP
- #include "opencv2/core/core_c.h"
- #ifdef __cplusplus
- namespace cv {
- template <typename T> class WImage;
- template <typename T> class WImageBuffer;
- template <typename T> class WImageView;
- template<typename T, int C> class WImageC;
- template<typename T, int C> class WImageBufferC;
- template<typename T, int C> class WImageViewC;
- typedef WImage<uchar> WImage_b;
- typedef WImageView<uchar> WImageView_b;
- typedef WImageBuffer<uchar> WImageBuffer_b;
- typedef WImageC<uchar, 1> WImage1_b;
- typedef WImageViewC<uchar, 1> WImageView1_b;
- typedef WImageBufferC<uchar, 1> WImageBuffer1_b;
- typedef WImageC<uchar, 3> WImage3_b;
- typedef WImageViewC<uchar, 3> WImageView3_b;
- typedef WImageBufferC<uchar, 3> WImageBuffer3_b;
- typedef WImage<float> WImage_f;
- typedef WImageView<float> WImageView_f;
- typedef WImageBuffer<float> WImageBuffer_f;
- typedef WImageC<float, 1> WImage1_f;
- typedef WImageViewC<float, 1> WImageView1_f;
- typedef WImageBufferC<float, 1> WImageBuffer1_f;
- typedef WImageC<float, 3> WImage3_f;
- typedef WImageViewC<float, 3> WImageView3_f;
- typedef WImageBufferC<float, 3> WImageBuffer3_f;
- typedef WImage<short> WImage_16s;
- typedef WImageView<short> WImageView_16s;
- typedef WImageBuffer<short> WImageBuffer_16s;
- typedef WImageC<short, 1> WImage1_16s;
- typedef WImageViewC<short, 1> WImageView1_16s;
- typedef WImageBufferC<short, 1> WImageBuffer1_16s;
- typedef WImageC<short, 3> WImage3_16s;
- typedef WImageViewC<short, 3> WImageView3_16s;
- typedef WImageBufferC<short, 3> WImageBuffer3_16s;
- typedef WImage<ushort> WImage_16u;
- typedef WImageView<ushort> WImageView_16u;
- typedef WImageBuffer<ushort> WImageBuffer_16u;
- typedef WImageC<ushort, 1> WImage1_16u;
- typedef WImageViewC<ushort, 1> WImageView1_16u;
- typedef WImageBufferC<ushort, 1> WImageBuffer1_16u;
- typedef WImageC<ushort, 3> WImage3_16u;
- typedef WImageViewC<ushort, 3> WImageView3_16u;
- typedef WImageBufferC<ushort, 3> WImageBuffer3_16u;
- template<typename T>
- class WImage
- {
- public:
- typedef T BaseType;
-
-
- virtual ~WImage() = 0;
-
- IplImage* Ipl() {return image_; }
- const IplImage* Ipl() const {return image_; }
- T* ImageData() { return reinterpret_cast<T*>(image_->imageData); }
- const T* ImageData() const {
- return reinterpret_cast<const T*>(image_->imageData);
- }
- int Width() const {return image_->width; }
- int Height() const {return image_->height; }
-
- int WidthStep() const {return image_->widthStep; }
- int Channels() const {return image_->nChannels; }
- int ChannelSize() const {return sizeof(T); }
-
- int PixelSize() const {return Channels() * ChannelSize(); }
-
-
-
- int Depth() const;
- inline const T* Row(int r) const {
- return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep);
- }
- inline T* Row(int r) {
- return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep);
- }
-
- inline T* operator() (int c, int r) {
- return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep) +
- c*Channels();
- }
- inline const T* operator() (int c, int r) const {
- return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep) +
- c*Channels();
- }
-
- void CopyFrom(const WImage<T>& src) { cvCopy(src.Ipl(), image_); }
-
- void SetZero() { cvSetZero(image_); }
-
- WImageView<T> View(int c, int r, int width, int height);
- protected:
-
- WImage(const WImage&);
- void operator=(const WImage&);
- explicit WImage(IplImage* img) : image_(img) {
- assert(!img || img->depth == Depth());
- }
- void SetIpl(IplImage* image) {
- assert(!image || image->depth == Depth());
- image_ = image;
- }
- IplImage* image_;
- };
- template<typename T, int C>
- class WImageC : public WImage<T>
- {
- public:
- typedef typename WImage<T>::BaseType BaseType;
- enum { kChannels = C };
- explicit WImageC(IplImage* img) : WImage<T>(img) {
- assert(!img || img->nChannels == Channels());
- }
-
- WImageViewC<T, C> View(int c, int r, int width, int height);
-
- void CopyFrom(const WImageC<T, C>& src) {
- cvCopy(src.Ipl(), WImage<T>::image_);
- }
-
-
- virtual ~WImageC() = 0;
- int Channels() const {return C; }
- protected:
-
- WImageC(const WImageC&);
- void operator=(const WImageC&);
- void SetIpl(IplImage* image) {
- assert(!image || image->depth == WImage<T>::Depth());
- WImage<T>::SetIpl(image);
- }
- };
- template<typename T>
- class WImageBuffer : public WImage<T>
- {
- public:
- typedef typename WImage<T>::BaseType BaseType;
-
- WImageBuffer() : WImage<T>(0) {}
- WImageBuffer(int width, int height, int nchannels) : WImage<T>(0) {
- Allocate(width, height, nchannels);
- }
-
-
- explicit WImageBuffer(IplImage* img) : WImage<T>(img) {}
-
-
- void Allocate(int width, int height, int nchannels);
-
- void SetIpl(IplImage* img) {
- ReleaseImage();
- WImage<T>::SetIpl(img);
- }
-
- void CloneFrom(const WImage<T>& src) {
- Allocate(src.Width(), src.Height(), src.Channels());
- CopyFrom(src);
- }
- ~WImageBuffer() {
- ReleaseImage();
- }
-
- void ReleaseImage() {
- if (WImage<T>::image_) {
- IplImage* image = WImage<T>::image_;
- cvReleaseImage(&image);
- WImage<T>::SetIpl(0);
- }
- }
- bool IsNull() const {return WImage<T>::image_ == NULL; }
- private:
-
- WImageBuffer(const WImageBuffer&);
- void operator=(const WImageBuffer&);
- };
- template<typename T, int C>
- class WImageBufferC : public WImageC<T, C>
- {
- public:
- typedef typename WImage<T>::BaseType BaseType;
- enum { kChannels = C };
-
- WImageBufferC() : WImageC<T, C>(0) {}
- WImageBufferC(int width, int height) : WImageC<T, C>(0) {
- Allocate(width, height);
- }
-
-
- explicit WImageBufferC(IplImage* img) : WImageC<T, C>(img) {}
-
-
- void Allocate(int width, int height);
-
- void SetIpl(IplImage* img) {
- ReleaseImage();
- WImageC<T, C>::SetIpl(img);
- }
-
- void CloneFrom(const WImageC<T, C>& src) {
- Allocate(src.Width(), src.Height());
- CopyFrom(src);
- }
- ~WImageBufferC() {
- ReleaseImage();
- }
-
- void ReleaseImage() {
- if (WImage<T>::image_) {
- IplImage* image = WImage<T>::image_;
- cvReleaseImage(&image);
- WImageC<T, C>::SetIpl(0);
- }
- }
- bool IsNull() const {return WImage<T>::image_ == NULL; }
- private:
-
- WImageBufferC(const WImageBufferC&);
- void operator=(const WImageBufferC&);
- };
- template<typename T> class WImageView : public WImage<T>
- {
- public:
- typedef typename WImage<T>::BaseType BaseType;
-
-
- WImageView(WImage<T>* img, int c, int r, int width, int height);
-
-
- WImageView(T* data, int width, int height, int channels, int width_step = -1);
-
-
- WImageView(IplImage* img) : WImage<T>(img) {}
-
- WImageView(const WImage<T>& img) : WImage<T>(0) {
- header_ = *(img.Ipl());
- WImage<T>::SetIpl(&header_);
- }
- WImageView& operator=(const WImage<T>& img) {
- header_ = *(img.Ipl());
- WImage<T>::SetIpl(&header_);
- return *this;
- }
- protected:
- IplImage header_;
- };
- template<typename T, int C>
- class WImageViewC : public WImageC<T, C>
- {
- public:
- typedef typename WImage<T>::BaseType BaseType;
- enum { kChannels = C };
-
- WImageViewC();
- virtual ~WImageViewC() {}
-
-
- WImageViewC(WImageC<T, C>* img,
- int c, int r, int width, int height);
-
- WImageViewC(T* data, int width, int height, int width_step = -1);
-
-
- WImageViewC(IplImage* img) : WImageC<T, C>(img) {}
-
-
-
- WImageViewC(const WImageC<T, C>& img) : WImageC<T, C>(0) {
- header_ = *(img.Ipl());
- WImageC<T, C>::SetIpl(&header_);
- }
- WImageViewC(const WImageViewC<T, C>& img) : WImageC<T, C>(0) {
- header_ = *(img.Ipl());
- WImageC<T, C>::SetIpl(&header_);
- }
- WImageViewC& operator=(const WImageC<T, C>& img) {
- header_ = *(img.Ipl());
- WImageC<T, C>::SetIpl(&header_);
- return *this;
- }
- WImageViewC& operator=(const WImageViewC<T, C>& img) {
- header_ = *(img.Ipl());
- WImageC<T, C>::SetIpl(&header_);
- return *this;
- }
- protected:
- IplImage header_;
- };
- template<>
- inline int WImage<uchar>::Depth() const {return IPL_DEPTH_8U; }
- template<>
- inline int WImage<signed char>::Depth() const {return IPL_DEPTH_8S; }
- template<>
- inline int WImage<short>::Depth() const {return IPL_DEPTH_16S; }
- template<>
- inline int WImage<ushort>::Depth() const {return IPL_DEPTH_16U; }
- template<>
- inline int WImage<int>::Depth() const {return IPL_DEPTH_32S; }
- template<>
- inline int WImage<float>::Depth() const {return IPL_DEPTH_32F; }
- template<>
- inline int WImage<double>::Depth() const {return IPL_DEPTH_64F; }
- template<typename T> inline WImage<T>::~WImage() {}
- template<typename T, int C> inline WImageC<T, C>::~WImageC() {}
- template<typename T>
- inline void WImageBuffer<T>::Allocate(int width, int height, int nchannels)
- {
- if (IsNull() || WImage<T>::Width() != width ||
- WImage<T>::Height() != height || WImage<T>::Channels() != nchannels) {
- ReleaseImage();
- WImage<T>::image_ = cvCreateImage(cvSize(width, height),
- WImage<T>::Depth(), nchannels);
- }
- }
- template<typename T, int C>
- inline void WImageBufferC<T, C>::Allocate(int width, int height)
- {
- if (IsNull() || WImage<T>::Width() != width || WImage<T>::Height() != height) {
- ReleaseImage();
- WImageC<T, C>::SetIpl(cvCreateImage(cvSize(width, height),WImage<T>::Depth(), C));
- }
- }
- template<typename T>
- WImageView<T>::WImageView(WImage<T>* img, int c, int r, int width, int height)
- : WImage<T>(0)
- {
- header_ = *(img->Ipl());
- header_.imageData = reinterpret_cast<char*>((*img)(c, r));
- header_.width = width;
- header_.height = height;
- WImage<T>::SetIpl(&header_);
- }
- template<typename T>
- WImageView<T>::WImageView(T* data, int width, int height, int nchannels, int width_step)
- : WImage<T>(0)
- {
- cvInitImageHeader(&header_, cvSize(width, height), WImage<T>::Depth(), nchannels);
- header_.imageData = reinterpret_cast<char*>(data);
- if (width_step > 0) {
- header_.widthStep = width_step;
- }
- WImage<T>::SetIpl(&header_);
- }
- template<typename T, int C>
- WImageViewC<T, C>::WImageViewC(WImageC<T, C>* img, int c, int r, int width, int height)
- : WImageC<T, C>(0)
- {
- header_ = *(img->Ipl());
- header_.imageData = reinterpret_cast<char*>((*img)(c, r));
- header_.width = width;
- header_.height = height;
- WImageC<T, C>::SetIpl(&header_);
- }
- template<typename T, int C>
- WImageViewC<T, C>::WImageViewC() : WImageC<T, C>(0) {
- cvInitImageHeader(&header_, cvSize(0, 0), WImage<T>::Depth(), C);
- header_.imageData = reinterpret_cast<char*>(0);
- WImageC<T, C>::SetIpl(&header_);
- }
- template<typename T, int C>
- WImageViewC<T, C>::WImageViewC(T* data, int width, int height, int width_step)
- : WImageC<T, C>(0)
- {
- cvInitImageHeader(&header_, cvSize(width, height), WImage<T>::Depth(), C);
- header_.imageData = reinterpret_cast<char*>(data);
- if (width_step > 0) {
- header_.widthStep = width_step;
- }
- WImageC<T, C>::SetIpl(&header_);
- }
- template<typename T>
- WImageView<T> WImage<T>::View(int c, int r, int width, int height) {
- return WImageView<T>(this, c, r, width, height);
- }
- template<typename T, int C>
- WImageViewC<T, C> WImageC<T, C>::View(int c, int r, int width, int height) {
- return WImageViewC<T, C>(this, c, r, width, height);
- }
- }
- #endif
- #endif
|