zoukankan      html  css  js  c++  java
  • CvvImage类

          从OpenCV 2.2.0开始,OpenCV取消了CvvImage这个类。可是今天要用到,可以自己加入到工程中。

    首先,找到CvvImage的原代码。我在网上已经找到了,具体代码如下。

          这是CvvImage.h文件。

    #pragma once
    #ifndef CVVIMAGE_CLASS_DEF
    #define CVVIMAGE_CLASS_DEF
    #include "opencv.hpp"
    /* CvvImage class definition */
    class  CvvImage
    {
    public:
       CvvImage();
       virtual ~CvvImage();
       /* Create image (BGR or grayscale) */
       virtual bool  Create( int width, int height, int bits_per_pixel, int image_origin = 0 );
       /* Load image from specified file */
       virtual bool  Load( const char* filename, int desired_color = 1 );
       /* Load rectangle from the file */
       virtual bool  LoadRect( const char* filename,
          int desired_color, CvRect r );
    #if defined WIN32 || defined _WIN32
       virtual bool  LoadRect( const char* filename,
          int desired_color, RECT r )
       {
          return LoadRect( filename, desired_color,
             cvRect( r.left, r.top, r.right - r.left, r.bottom - r.top ));
       }
    #endif
       /* Save entire image to specified file. */
       virtual bool  Save( const char* filename );
       /* Get copy of input image ROI */
       virtual void  CopyOf( CvvImage& image, int desired_color = -1 );
       virtual void  CopyOf( IplImage* img, int desired_color = -1 );
       IplImage* GetImage() { return m_img; };
       virtual void  Destroy(void);
       /* width and height of ROI */
       int Width() { return !m_img ? 0 : !m_img->roi ? m_img->width : m_img->roi->width; };
       int Height() { return !m_img ? 0 : !m_img->roi ? m_img->height : m_img->roi->height;};
       int Bpp() { return m_img ? (m_img->depth & 255)*m_img->nChannels : 0; };
       virtual void  Fill( int color );
       /* draw to highgui window */
       virtual void  Show( const char* window );
    
    #if defined WIN32 || defined _WIN32
       /* draw part of image to the specified DC */
       virtual void  Show( HDC dc, int x, int y, int width, int height,
          int from_x = 0, int from_y = 0 );
       /* draw the current image ROI to the specified rectangle of the destination DC */
       virtual void  DrawToHDC( HDC hDCDst, RECT* pDstRect );
    #endif
    protected:
       IplImage*  m_img;
    };
    typedef CvvImage CImage;
    #endif

    原代码文件:

    #include "StdAfx.h"
    #include "CvvImage.h"
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    CV_INLINE RECT NormalizeRect( RECT r );
    CV_INLINE RECT NormalizeRect( RECT r )
    {
       int t;
       if( r.left > r.right )
       {
          t = r.left;
          r.left = r.right;
          r.right = t;
       }
       if( r.top > r.bottom )
       {
          t = r.top;
          r.top = r.bottom;
          r.bottom = t;
       }
    
       return r;
    }
    CV_INLINE CvRect RectToCvRect( RECT sr );
    CV_INLINE CvRect RectToCvRect( RECT sr )
    {
       sr = NormalizeRect( sr );
       return cvRect( sr.left, sr.top, sr.right - sr.left, sr.bottom - sr.top );
    }
    CV_INLINE RECT CvRectToRect( CvRect sr );
    CV_INLINE RECT CvRectToRect( CvRect sr )
    {
       RECT dr;
       dr.left = sr.x;
       dr.top = sr.y;
       dr.right = sr.x + sr.width;
       dr.bottom = sr.y + sr.height;
    
       return dr;
    }
    CV_INLINE IplROI RectToROI( RECT r );
    CV_INLINE IplROI RectToROI( RECT r )
    {
       IplROI roi;
       r = NormalizeRect( r );
       roi.xOffset = r.left;
       roi.yOffset = r.top;
       roi.width = r.right - r.left;
       roi.height = r.bottom - r.top;
       roi.coi = 0;
    
       return roi;
    }
    void  FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
    {
       assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
    
       BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
    
       memset( bmih, 0, sizeof(*bmih));
       bmih->biSize = sizeof(BITMAPINFOHEADER);
       bmih->biWidth = width;
       bmih->biHeight = origin ? abs(height) : -abs(height);
       bmih->biPlanes = 1;
       bmih->biBitCount = (unsigned short)bpp;
       bmih->biCompression = BI_RGB;
       if( bpp == 8 )
       {
          RGBQUAD* palette = bmi->bmiColors;
          int i;
          for( i = 0; i < 256; i++ )
          {
             palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
             palette[i].rgbReserved = 0;
          }
       }
    }
    CvvImage::CvvImage()
    {
       m_img = 0;
    }
    void CvvImage::Destroy()
    {
       cvReleaseImage( &m_img );
    }
    CvvImage::~CvvImage()
    {
       Destroy();
    }
    bool  CvvImage::Create( int w, int h, int bpp, int origin )
    {
       const unsigned max_img_size = 10000;
    
       if( (bpp != 8 && bpp != 24 && bpp != 32) ||
          (unsigned)w >=  max_img_size || (unsigned)h >= max_img_size ||
          (origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL))
       {
          assert(0); // most probably, it is a programming error
          return false;
       }
       if( !m_img || Bpp() != bpp || m_img->width != w || m_img->height != h )
       {
          if( m_img && m_img->nSize == sizeof(IplImage))
             Destroy();
          /* prepare IPL header */
          m_img = cvCreateImage( cvSize( w, h ), IPL_DEPTH_8U, bpp/8 );
       }
       if( m_img )
          m_img->origin = origin == 0 ? IPL_ORIGIN_TL : IPL_ORIGIN_BL;
       return m_img != 0;
    }
    void  CvvImage::CopyOf( CvvImage& image, int desired_color )
    {
       IplImage* img = image.GetImage();
       if( img )
       {
          CopyOf( img, desired_color );
       }
    }
    #define HG_IS_IMAGE(img)                                                  
       ((img) != 0 && ((const IplImage*)(img))->nSize == sizeof(IplImage) && 
       ((IplImage*)img)->imageData != 0)
    void  CvvImage::CopyOf( IplImage* img, int desired_color )
    {
       if( HG_IS_IMAGE(img) )
       {
          int color = desired_color;
          CvSize size = cvGetSize( img ); 
          if( color < 0 )
             color = img->nChannels > 1;
          if( Create( size.width, size.height,
             (!color ? 1 : img->nChannels > 1 ? img->nChannels : 3)*8,
             img->origin ))
          {
             cvConvertImage( img, m_img, 0 );
          }
       }
    }
    bool  CvvImage::Load( const char* filename, int desired_color )
    {
       IplImage* img = cvLoadImage( filename, desired_color );
       if( !img )
          return false;
    
       CopyOf( img, desired_color );
       cvReleaseImage( &img );
    
       return true;
    }
    bool  CvvImage::LoadRect( const char* filename,
                       int desired_color, CvRect r )
    {
       if( r.width < 0 || r.height < 0 ) return false;
    
       IplImage* img = cvLoadImage( filename, desired_color );
       if( !img )
          return false;
       if( r.width == 0 || r.height == 0 )
       {
          r.width = img->width;
          r.height = img->height;
          r.x = r.y = 0;
       }
       if( r.x > img->width || r.y > img->height ||
          r.x + r.width < 0 || r.y + r.height < 0 )
       {
          cvReleaseImage( &img );
          return false;
       }
       /* truncate r to source image */
       if( r.x < 0 )
       {
          r.width += r.x;
          r.x = 0;
       }
       if( r.y < 0 )
       {
          r.height += r.y;
          r.y = 0;
       }
       if( r.x + r.width > img->width )
          r.width = img->width - r.x;
    
       if( r.y + r.height > img->height )
          r.height = img->height - r.y;
       cvSetImageROI( img, r );
       CopyOf( img, desired_color );
       cvReleaseImage( &img );
       return true;
    }
    bool  CvvImage::Save( const char* filename )
    {
       if( !m_img )
          return false;
       cvSaveImage( filename, m_img );
       return true;
    }
    void  CvvImage::Show( const char* window )
    {
       if( m_img )
          cvShowImage( window, m_img );
    }
    void  CvvImage::Show( HDC dc, int x, int y, int w, int h, int from_x, int from_y )
    {
       if( m_img && m_img->depth == IPL_DEPTH_8U )
       {
          uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
          BITMAPINFO* bmi = (BITMAPINFO*)buffer;
          int bmp_w = m_img->width, bmp_h = m_img->height;
          FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );
          from_x = MIN( MAX( from_x, 0 ), bmp_w - 1 );
          from_y = MIN( MAX( from_y, 0 ), bmp_h - 1 );
          int sw = MAX( MIN( bmp_w - from_x, w ), 0 );
          int sh = MAX( MIN( bmp_h - from_y, h ), 0 );
          SetDIBitsToDevice(
             dc, x, y, sw, sh, from_x, from_y, from_y, sh,
             m_img->imageData + from_y*m_img->widthStep,
             bmi, DIB_RGB_COLORS );
       }
    }
    void  CvvImage::DrawToHDC( HDC hDCDst, RECT* pDstRect ) 
    {
       if( pDstRect && m_img && m_img->depth == IPL_DEPTH_8U && m_img->imageData )
       {
          uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
          BITMAPINFO* bmi = (BITMAPINFO*)buffer;
          int bmp_w = m_img->width, bmp_h = m_img->height;
          CvRect roi = cvGetImageROI( m_img );
          CvRect dst = RectToCvRect( *pDstRect );
          if( roi.width == dst.width && roi.height == dst.height )
          {
             Show( hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y );
             return;
          }
          if( roi.width > dst.width )
          {
             SetStretchBltMode(
                hDCDst,           // handle to device context
                HALFTONE );
          }
          else
          {
             SetStretchBltMode(
                hDCDst,           // handle to device context
                COLORONCOLOR );
          }
          FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );
          ::StretchDIBits(
             hDCDst,
             dst.x, dst.y, dst.width, dst.height,
             roi.x, roi.y, roi.width, roi.height,
             m_img->imageData, bmi, DIB_RGB_COLORS, SRCCOPY );
       }
    }
    void  CvvImage::Fill( int color )
    {
       cvSet( m_img, cvScalar(color&255,(color>>8)&255,(color>>16)&255,(color>>24)&255) );
    }
    #include "StdAfx.h"
    #include "CvvImage.h"
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    CV_INLINE RECT NormalizeRect( RECT r );
    CV_INLINE RECT NormalizeRect( RECT r )
    {
       int t;
       if( r.left > r.right )
       {
          t = r.left;
          r.left = r.right;
          r.right = t;
       }
       if( r.top > r.bottom )
       {
          t = r.top;
          r.top = r.bottom;
          r.bottom = t;
       }
    
       return r;
    }
    CV_INLINE CvRect RectToCvRect( RECT sr );
    CV_INLINE CvRect RectToCvRect( RECT sr )
    {
       sr = NormalizeRect( sr );
       return cvRect( sr.left, sr.top, sr.right - sr.left, sr.bottom - sr.top );
    }
    CV_INLINE RECT CvRectToRect( CvRect sr );
    CV_INLINE RECT CvRectToRect( CvRect sr )
    {
       RECT dr;
       dr.left = sr.x;
       dr.top = sr.y;
       dr.right = sr.x + sr.width;
       dr.bottom = sr.y + sr.height;
    
       return dr;
    }
    CV_INLINE IplROI RectToROI( RECT r );
    CV_INLINE IplROI RectToROI( RECT r )
    {
       IplROI roi;
       r = NormalizeRect( r );
       roi.xOffset = r.left;
       roi.yOffset = r.top;
       roi.width = r.right - r.left;
       roi.height = r.bottom - r.top;
       roi.coi = 0;
    
       return roi;
    }
    void  FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
    {
       assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
    
       BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
    
       memset( bmih, 0, sizeof(*bmih));
       bmih->biSize = sizeof(BITMAPINFOHEADER);
       bmih->biWidth = width;
       bmih->biHeight = origin ? abs(height) : -abs(height);
       bmih->biPlanes = 1;
       bmih->biBitCount = (unsigned short)bpp;
       bmih->biCompression = BI_RGB;
       if( bpp == 8 )
       {
          RGBQUAD* palette = bmi->bmiColors;
          int i;
          for( i = 0; i < 256; i++ )
          {
             palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
             palette[i].rgbReserved = 0;
          }
       }
    }
    CvvImage::CvvImage()
    {
       m_img = 0;
    }
    void CvvImage::Destroy()
    {
       cvReleaseImage( &m_img );
    }
    CvvImage::~CvvImage()
    {
       Destroy();
    }
    bool  CvvImage::Create( int w, int h, int bpp, int origin )
    {
       const unsigned max_img_size = 10000;
    
       if( (bpp != 8 && bpp != 24 && bpp != 32) ||
          (unsigned)w >=  max_img_size || (unsigned)h >= max_img_size ||
          (origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL))
       {
          assert(0); // most probably, it is a programming error
          return false;
       }
       if( !m_img || Bpp() != bpp || m_img->width != w || m_img->height != h )
       {
          if( m_img && m_img->nSize == sizeof(IplImage))
             Destroy();
          /* prepare IPL header */
          m_img = cvCreateImage( cvSize( w, h ), IPL_DEPTH_8U, bpp/8 );
       }
       if( m_img )
          m_img->origin = origin == 0 ? IPL_ORIGIN_TL : IPL_ORIGIN_BL;
       return m_img != 0;
    }
    void  CvvImage::CopyOf( CvvImage& image, int desired_color )
    {
       IplImage* img = image.GetImage();
       if( img )
       {
          CopyOf( img, desired_color );
       }
    }
    #define HG_IS_IMAGE(img)                                                  
       ((img) != 0 && ((const IplImage*)(img))->nSize == sizeof(IplImage) && 
       ((IplImage*)img)->imageData != 0)
    void  CvvImage::CopyOf( IplImage* img, int desired_color )
    {
       if( HG_IS_IMAGE(img) )
       {
          int color = desired_color;
          CvSize size = cvGetSize( img ); 
          if( color < 0 )
             color = img->nChannels > 1;
          if( Create( size.width, size.height,
             (!color ? 1 : img->nChannels > 1 ? img->nChannels : 3)*8,
             img->origin ))
          {
             cvConvertImage( img, m_img, 0 );
          }
       }
    }
    bool  CvvImage::Load( const char* filename, int desired_color )
    {
       IplImage* img = cvLoadImage( filename, desired_color );
       if( !img )
          return false;
    
       CopyOf( img, desired_color );
       cvReleaseImage( &img );
    
       return true;
    }
    bool  CvvImage::LoadRect( const char* filename,
                       int desired_color, CvRect r )
    {
       if( r.width < 0 || r.height < 0 ) return false;
    
       IplImage* img = cvLoadImage( filename, desired_color );
       if( !img )
          return false;
       if( r.width == 0 || r.height == 0 )
       {
          r.width = img->width;
          r.height = img->height;
          r.x = r.y = 0;
       }
       if( r.x > img->width || r.y > img->height ||
          r.x + r.width < 0 || r.y + r.height < 0 )
       {
          cvReleaseImage( &img );
          return false;
       }
       /* truncate r to source image */
       if( r.x < 0 )
       {
          r.width += r.x;
          r.x = 0;
       }
       if( r.y < 0 )
       {
          r.height += r.y;
          r.y = 0;
       }
       if( r.x + r.width > img->width )
          r.width = img->width - r.x;
    
       if( r.y + r.height > img->height )
          r.height = img->height - r.y;
       cvSetImageROI( img, r );
       CopyOf( img, desired_color );
       cvReleaseImage( &img );
       return true;
    }
    bool  CvvImage::Save( const char* filename )
    {
       if( !m_img )
          return false;
       cvSaveImage( filename, m_img );
       return true;
    }
    void  CvvImage::Show( const char* window )
    {
       if( m_img )
          cvShowImage( window, m_img );
    }
    void  CvvImage::Show( HDC dc, int x, int y, int w, int h, int from_x, int from_y )
    {
       if( m_img && m_img->depth == IPL_DEPTH_8U )
       {
          uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
          BITMAPINFO* bmi = (BITMAPINFO*)buffer;
          int bmp_w = m_img->width, bmp_h = m_img->height;
          FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );
          from_x = MIN( MAX( from_x, 0 ), bmp_w - 1 );
          from_y = MIN( MAX( from_y, 0 ), bmp_h - 1 );
          int sw = MAX( MIN( bmp_w - from_x, w ), 0 );
          int sh = MAX( MIN( bmp_h - from_y, h ), 0 );
          SetDIBitsToDevice(
             dc, x, y, sw, sh, from_x, from_y, from_y, sh,
             m_img->imageData + from_y*m_img->widthStep,
             bmi, DIB_RGB_COLORS );
       }
    }
    void  CvvImage::DrawToHDC( HDC hDCDst, RECT* pDstRect ) 
    {
       if( pDstRect && m_img && m_img->depth == IPL_DEPTH_8U && m_img->imageData )
       {
          uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
          BITMAPINFO* bmi = (BITMAPINFO*)buffer;
          int bmp_w = m_img->width, bmp_h = m_img->height;
          CvRect roi = cvGetImageROI( m_img );
          CvRect dst = RectToCvRect( *pDstRect );
          if( roi.width == dst.width && roi.height == dst.height )
          {
             Show( hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y );
             return;
          }
          if( roi.width > dst.width )
          {
             SetStretchBltMode(
                hDCDst,           // handle to device context
                HALFTONE );
          }
          else
          {
             SetStretchBltMode(
                hDCDst,           // handle to device context
                COLORONCOLOR );
          }
          FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );
          ::StretchDIBits(
             hDCDst,
             dst.x, dst.y, dst.width, dst.height,
             roi.x, roi.y, roi.width, roi.height,
             m_img->imageData, bmi, DIB_RGB_COLORS, SRCCOPY );
       }
    }
    void  CvvImage::Fill( int color )
    {
       cvSet( m_img, cvScalar(color&255,(color>>8)&255,(color>>16)&255,(color>>24)&255) );
    }

          找到原文件之后就好办了。你就可以自己添加到自己的所需要的工程中去了。

    其次:保存文件

          将上面的文件要保存起来,分别将其粘贴在.txt文件中,然后改掉名字为:CvvImage.h 和 CvvImage.cpp

    最后:添加CvvImage文件

    打开solution Explorer ,右击Header files,添加CvvImage.h; 再右击Source files 添加 CvvImage.cpp

    如图所示:

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/yssongest/p/3413179.html
Copyright © 2011-2022 走看看