当前位置: 首页 > 编程日记 > 正文

OpenCV 2.2.0 CvvImage的使用

转自:http://blog.csdn.net/raocong2010/archive/2011/01/17/6146158.aspx#

前几日,OpenCV 2.2.0版本出现了...但是...以前版本的CvvImage类不见了...为了能够继续使用这个类,下面把这个类的源代码贴出来,使用的时候将该代码加入到工程中便可以使用了。为了方便切换OpenCV的版本,这里用到了一些条件编译宏,来保证代码的灵活性。

不过OpenCV 2.2.0取消CvvImage这个类,一定是有它的原因的,具体可以在做实验的时候体会这些原因。

CvvImage头文件

#ifndef CVVIMAGE_CLASS_DEF
#define CVVIMAGE_CLASS_DEF

#include <cv.h>
#include <highgui.h>

/* 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

CvvImage源文件

#include "public.h"

#ifndef RC_OPENCV_2_1_0 // RC_OPENCV_2_1_0
#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) );
}

#endif // RC_OPENCV_2_1_0

public.h文件

#pragma once

#undef RC_OPENCV_2_1_0

/** 使用OpenCV 2.2.0, 则不定义下面的宏 */
/** #define RC_OPENCV_2_1_0 */

#ifdef _DEBUG
    #ifdef RC_OPENCV_2_1_0
        #pragma comment( lib, "cxcore210d.lib" )
        #pragma comment( lib, "cv210d.lib" )
        #pragma comment( lib, "highgui210d.lib" )
    #else
        #pragma comment( lib, "opencv_core220d.lib" )
        #pragma comment( lib, "opencv_highgui220d.lib" )
        #pragma comment( lib, "opencv_imgproc220d.lib" )
    #endif
#else
    #ifdef RC_OPENCV_2_1_0
        #pragma comment( lib, "cxcore210.lib" )
        #pragma comment( lib, "cv210.lib" )
        #pragma comment( lib, "highgui210.lib" )
    #else
        #pragma comment( lib, "opencv_core220.lib" )
        #pragma comment( lib, "opencv_highgui220.lib" )
        #pragma comment( lib, "opencv_imgproc220.lib" )
    #endif
#endif

相关文章:

c/c++标准预定义宏

转自&#xff1a;http://www.eefocus.com/andysun001/blog/10-06/192018_008b3.html 一、标准预定义宏The standard predefined macros are specified by the relevant language standards, so they are available with all compilers that implement those standards. Older c…

阿里AI攻克心血管识别技术,冠脉中心线提取论文入选国际医学影像会议

阿里在医疗AI领域取得新进展&#xff0c;继创下肺结节检测、肝结节诊断技术的重大突破后&#xff0c;又攻克了难度系数更高的心血管识别技术。 近日&#xff0c;阿里达摩院机器智能实验室有关冠状动脉中心线提取的论文已被国际顶级医学影像会议MICCAI 2019提前接收。 阿里AI论…

自由程序员在国外

可靠的做法是&#xff0c;在一些像oDesk这样的网站上找一些临时开发任务&#xff0c;在Linked In网站上提交一份个人简历。这样将有助于你在出行后尽早的找到可干的项目&#xff0c;而不必到时大减价来抢其他程序员的活儿(或消减自己的预算)。 从来不缺乏你可以捐赠代码的开源项…

关于spring aop Advisor排序问题

关于spring aop Advisor排序问题 当我们使用多个Advisor的时候有时候需要排序&#xff0c;这时候可以用注解org.springframework.core.annotation.Order或者实现org.springframework.core.Ordered接口。 示例代码&#xff1a; import org.aspectj.lang.ProceedingJoinPoint; im…

NLP重大突破?一文读懂XLNet“屠榜”背后的原理

作者 | 李理 原文链接&#xff1a;https://fancyerii.github.io/2019/06/30/xlnet-theory/ 本文介绍XLNet的基本原理&#xff0c;读者阅读前需要了解BERT等相关模型&#xff0c;不熟悉的读者建议学习BERT课程。 语言模型和BERT各自的优缺点 在论文里作者使用了一些术语&#…

CSS3支持IE6, 7, and 8的边框属性

我们都知道&#xff0c;IE 6,7不支持新增加的CSS3属性&#xff0c;甚至与IE8是CSS3还没有完全准备好。你知道吗&#xff0c;今天给大家分享一个脚本工具&#xff0c;可以帮助您启用CSS3的支持IE浏览器&#xff08;IE6&#xff09;与新的CSS3属性&#xff0c;包括&#xff1a;bo…

解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题

转自&#xff1a;http://blog.csdn.net/code_robot/archive/2010/06/23/5688867.aspx 有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法&#xff1a;1、使用C语言的函数设置为中文运行环境setlocale(LC_ALL,"Chinese-simplified"); 2、使用STL函…

NLP文本标注工具与平台(数据标注公司)

最近在做NLP相关项目&#xff0c;包括句法分析、情感分析等&#xff0c;有大量数据需要标注。我评估了几个文本标注工具&#xff0c;也接触了几家数据标注公司和平台&#xff0c;总结如下&#xff0c;供各位参考。 文本标注平台&#xff08;标注外包公司&#xff09; 数据标注公…

一文读懂基于神经网络的图片风格转移

作者 | moliam转载自 CSDN 博客前言将A图片的风格转移到B图片上&#xff0c;指的是将A图片的抽象艺术风格&#xff08;如线条、色彩等等&#xff09;和B图片的内容框架合成为一幅图。自然地&#xff0c;A图片称为风格图&#xff0c;而B图片就称为内容图。就像这样&#xff1a;左…

【物联网中间件平台-01】真正面向物联网的组态软件 YFIOs和YFHMI的前生今世

1前言 从2001年进入工控领域以来&#xff0c;前后7年多的时间开发了诸如二型计量监控系统、焦炉四大机车自动化系统、烧结配水监控系统、隧道广告影像系统、通用组态软件、嵌入式系统组态软件&#xff08;基于WINCE系统&#xff09;、LED视频影像系统和ICU病室输液管理等系统。…

OpenCV常遇问题解决方法汇总

1、cvLoad的使用和释放&#xff1a; CvMat *mat (CvMat*)cvLoad("a.xml"); cvRelease((void**)&mat); 2、cvCreateMatHeader的使用和释放&#xff1a; CvMat *mat cvCreateMatHeader(4, 2, CV_64FC1); cvReleaseMatHeader(&mat); 在OpenCV2.1及OpenCV2.2中…

分享我如何在7年时间里成长为阿里Java架构师(附学习路线图)

2019独角兽企业重金招聘Python工程师标准>>> 如何更高效的学习&#xff1f; 1.架构师应不应该写代码 总的来说&#xff0c;架构师和程序员在某些方面上有点像产品经理和用户的关系&#xff0c;大部分程序员并不会主动告诉你他们想要什么、哪里需要优化&#xff0c;甚…

github 与git 使用 及配置

git 是网上很流行的版本控制工具 ,尝试 熟悉并使用 它&#xff08;也有windows版本&#xff0c;这里介绍mac的&#xff09; 额&#xff0c;再操作前 先看看这个 并跟着做做 http://www.uml.org.cn/pzgl/201204285.asp 1&#xff0c;到github官网 申请账号 2&#xff0c;…

如何发布ActiveX 控件

转自&#xff1a;http://blog.csdn.net/zougangx/archive/2008/07/30/2738147.aspx [背景] 做过ActiveX控件的朋友都知道&#xff0c;要想把自己做的ActiveX控件功能放在自己的网页上使用&#xff0c;那么用户在客户端就必须进行本地的注册&#xff0c;也就是说用户得首先要把该…

200行代码实现一个滑动验证码

作者 | 崔庆才 转载自进击的Coder&#xff08;ID: FightingCoder&#xff09;做网络爬虫的同学肯定见过各种各样的验证码&#xff0c;比较高级的有滑动、点选等样式&#xff0c;看起来好像挺复杂的&#xff0c;但实际上它们的核心原理还是还是很清晰的&#xff0c;本文章大致说…

Envoy源码分析之Dispatcher

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; Dispatcher 在Envoy的代码中Dispatcher是随处可见的&#xff0c;可以说在Envoy中有着举足轻重的地位&#xff0c;一个Dispatcher就是一个EventLoop&#xff0c;其承担了任务队列、网络事件处理、定时器…

Windows 8 快捷键大全

为什么80%的码农都做不了架构师&#xff1f;>>> win8快捷键大全&#xff1a; Windows 键 X &#xff1a;Windows快捷菜单 Windows 键 C &#xff1a;显示个性分类和时钟 Windows 键 I &#xff1a;打开“设置”个性分类 Windows 键 K &#xff1a;打开“设备”…

Activex、OLE、COM、OCX、DLL之间区别、联系

转自&#xff1a;http://baike.baidu.com/view/393671.htm 概述 .ocx是ocx控件的扩展名,与.exe .dll同属于PE文件。下面说说什么是ocx控件! OCX 是对象类别扩充组件。 如果你用过Visual Basic或者Delphi一类的可视化编程工具&#xff0c;那么对控件这个概念一定不会陌生&#…

不写一行代码,也能玩转Kaggle竞赛?

整理 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】AI科技大本营会给大家分享一些 Kaggle 上的资源&#xff0c;如 Kaggle 开放的数据集&#xff0c;也会分享一些好的竞赛方案或有意义的竞赛经验&#xff0c;帮助大家成长。今天&#xf…

认识flask框架-2

1.json:基于键值对的字符串&#xff0c;轻量级的数据交互格式&#xff0c;用来传输数据 2.json模块 dumps:把字典转化成json字符串。 loads&#xff1a;把json字符串转成字典。 dump、load操作的是文件对象。 jsonify可以返回json字符串&#xff0c;会修改响应的类型为applicat…

Sencha-概念-Layouts(布局)(官网文档翻译8)

Sencha-概念-Layouts(布局)&#xff08;官网文档翻译8&#xff09; 介绍和HBox 布局描述了在您的应用程序的组件的大小和位置。例如&#xff0c;一个电子邮件客户端可能具有固定到左边的消息的列表&#xff0c;以说&#xff0c;可用的宽度的三分之一&#xff0c;和一个消息观看…

Photoshop图像处理操作汇总

1、给图像添加外边框&#xff0c;保持图像原有大小&#xff1a; 点击图层-->新建-->图层&#xff0c;弹出新图层对话框&#xff0c;点击确定&#xff0c;点按"Ctrl A”键将图像全部选中&#xff0c;再点击编辑>描边&#xff0c;弹出描边对话框&#xff0c;在宽…

人工智能进军餐饮:AI调酒,越喝越有

作者 | 神经小姐姐来源 | 转载自HyperAI超神经&#xff08;ID:HyperAI&#xff09;导读&#xff1a;“吃”&#xff0c;现在已经成了一种文化&#xff0c;对食物的不懈追求&#xff0c;可以说是人类历史的一种推动力。从烹饪的进化&#xff0c;到现在花样百出的美食&#xff0c…

LaTeX - 带圈数字

2019独角兽企业重金招聘Python工程师标准>>> 法I. by zepinglee \documentclass[UTF8]{ctexart} \XeTeXcharclass①1 \XeTeXcharclass②1 \XeTeXcharclass③1 \XeTeXcharclass④1 \XeTeXcharclass⑤1 \XeTeXcharclass⑥1 \XeTeXcharclass⑦1 \XeTeXcharclass⑧1 \Xe…

akcms折腾记

这几天闲着无聊&#xff0c;找cms折腾一下&#xff0c;先是搞了大名鼎鼎的dedecms&#xff0c;不过那繁琐真不是盖的&#xff0c;想修改个模板不知从哪里动手。虽然现在工作的后台也是由dedecms改过来的&#xff0c;但平时也就发发文章而已。 然后就找到了这个神器&#xff1a;…

VC++ OCX 控件注册

转自&#xff1a;http://www.cctry.com/thread-5334-1-1.html 方法一&#xff1a;在dos或Windows命令行下运行&#xff1a;regsvr32 ocxname.ocx 注册 示例&#xff1a; regsvr32 netshare.ocx //注册netshare.ocx控件 regsvr32 /u netshare.ocx //解除netshare.ocx控件…

程序猿生存指南-4 借钱风波

借钱风波&#xff08;10&#xff09;临近春节&#xff0c;我的朋友圈被各个公司的年终奖刷屏。土豪互联网公司有送现金的&#xff0c;有送豪车的&#xff0c;还有送别墅的。它们享受着移动互联网的红利&#xff0c;赚得盆满钵满。不过翻看公司请媒体写的那些报道&#xff0c;就…

赛灵思:人工智能芯片发展方向与误区

演讲嘉宾 | 姚颂&#xff0c;赛灵思人工智能业务资深总监整理 | 夕颜人工智能发展过程中&#xff0c;算力是一个重要的因素&#xff0c;算力就像是 AI 的燃油&#xff0c;没有燃油&#xff0c;AI 哪也去不了。而为 AI 应用提供算力的&#xff0c;正是各种各样的芯片。而近几年&…

Python 多线程抓取网页 牛人 use raw socket implement http request great

Python 多线程抓取网页 - 糖拌咸鱼 - 博客园Python 多线程抓取网页最近&#xff0c;一直在做网络爬虫相关的东西。 看了一下开源C写的larbin爬虫&#xff0c;仔细阅读了里面的设计思想和一些关键技术的实现。1、larbin的URL去重用的很高效的bloom filter算法&#xff1b; 2、DN…

从特斯拉到英伟达,那些端到端自动驾驶研发系统有何不同?

作者 | 黄浴&#xff0c;奇点首席科学家兼总裁来源 | 转载自知乎专栏自动驾驶与视觉感知导读&#xff1a;近日&#xff0c;吴恩达的 Drive.ai 被苹果收购的消息给了自动驾驶领域一记警钟&#xff0c;但这个领域的进展和成果犹在。本文将介绍一些端到端的自动驾驶研发系统&#…