CvvImage类在MFC中使用的说明
来源:互联网 发布:淘宝手机一屏尺寸多少 编辑:程序博客网 时间:2024/05/20 11:22
一、CvvImage介绍
平常使用Open CV时总是跳出一个个窗口,很难将项目进行系统集成,特别是在MFC等Windows环境中加载显示OpenCV中的图像,这时候就需要用到CvvImage类。由于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 _WIN32virtual 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 );#endifprotected:IplImage* m_img;};typedef CvvImage CImage;#endif
注意:参数中含有HDC(注:一种windows系统下定义的变量类型,用来描述设备描述表的句柄类型)类型的并不能保证移植到其他平台,例如Show/DrawToHDC等。后文中的DC,即device context(设备环境),一般可以理解为windows操作系统为方便绘图而抽象的”绘图表面“,“往窗口上绘图”,有时也被说成是“往窗口DC上绘图”。
【说明】
CvvImage::Create
bool CvvImage::Create(int w, int h, int bpp, int origin);
创建一个图像。 成功返回true, 失败返回false。
w 图像宽
h 图像高
bpp 每个像素的bit数, 值等于像素深度乘以通道数
origin 0 - 顶—左结构, 1 - 底—左结构 (Windows bitmaps 风格)
例: 创建一个400行600列的, IPL_DEPTH_8U类型的3通道图像, 顶—左结构
CvvImage img;
bool flag = img.Create(600, 400, IPL_DEPTH_8U*3, 0);
if(!flag) printf("创建图像失败!");
CvvImage::Load
bool CvvImage::Load(const char* filename, int desired_color);
装载一个图像。
filename 图像文件名称。
desired_color 图像波段数, 和cvLoadImage类似。
CvvImage::CopyOf
void CvvImage::CopyOf(CvvImage& img, int desired_color);void CvvImage::CopyOf(IplImage* img, int desired_color);从img复制图像到当前的对象中。
img 要复制的图像。
desired_color 为复制后图像的通道数, 复制后图像的像素深度为8bit。
例:// 读一个图像,然后复制为1个3通道的彩色图像
CvvImage img1, img2;
img1.Load("example.tiff");
img2.CopyOf(img1, 3);
CvvImage::LoadRect
bool CvvImage::LoadRect(const char* filename, int desired_color, CvRect rect);
从图像读出一个区域。
注 LoadRect是先用Load装载一个图像,然后再将rect设置为图像的ROI区域,然后复制图像得到,因此,如果一个图像很大(例如几百MB),即使想从中只读几个像素也是会失败的。filename 图像名称。 desired_color 图像波段数, 和cvLoadImage类似。 rect 要读取的图像范围。
CvvImage::Show
void CvvImage::Show(HDC dc, int x, int y, int w, int h, int from_x, int from_y);
绘制图像的部分到DC。 图像没有缩放。此函数仅在Windows下有效。
- dc 设备描述符。
- x 局部图像显示在DC上,从DC上的第x列开始。
- y 局部图像显示在DC上,从DC上的第y列开始。
- (x,y)为局部图像显示在DC上的起始位置。
- w 局部图像宽度。
- h 局部图像高度。
- from_x 从图像的第from_x列开始显示。
- from_y 从图像的第from_y行开始显示。
例:// 从图像10行20列开始,显示400行600列图像到设备描述符的100行200列开始的位置
CvvImage img;
img.Load("example.tiff");
img.Show(hDC, 200, 100, 600, 400, 20, 10);
CvvImage::Show
void CvvImage::Show(const char* window);
显示一个图像。 和cvShowImage相似。
CvvImage::DrawToHDC
void CImage::DrawToHDC(HDC hDCDst, RECT* pDstRect);
绘制图像的ROI区域到DC的pDstRect,如果图像大小和pDstRect不一致,图像会拉伸/压缩。此函数仅在Windows下有效。
- hDCDst 设备描述符。
- pDstRect 对应的设备描述符区域。
例:
CvvImage img; img.Load("example.tiff"); CRect rect; rect.left = 100; rect.top = 200; rect.right = rect.left + 600; rect.bottom = rect.top + 400; img.DrawToHDC(hDC, &rect);
CvvImage::Fill
void CvvImage::Fill(int color);
以color颜色填充图像。
CvvImage::Save
bool CvvImage::Save(const char* filename);保存图像
//注意:深拷贝 - 单独分配空间,两者相互独立 CvMat* a; CvMat* b = cvCloneMat(a); //copy a to b
2、Mat之间复制
//注意:浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)Mat a;Mat b = a; //a "copy" to bMat c(a); //a "copy" to c//注意:深拷贝Mat a;Mat b = a.clone(); //a copy to bMat c;a.copyTo(c); //a copy to c
3、CvMat与Mat互转
//使用Mat的构造函数:Mat::Mat(const CvMat* m, bool copyData=false); 默认情况下copyData为falseCvMat* a;//注意:以下三种效果一致,均为浅拷贝Mat b(a); //a "copy" to bMat b(a, false); //a "copy" to bMat b = a; //a "copy" to b//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)Mat b = Mat(a, true); //a copy to b
//注意:浅拷贝Mat a;CvMat b = a; //a "copy" to b//注意:深拷贝Mat a;CvMat *b;CvMat temp = a; //转化为CvMat类型,而不是复制数据cvCopy(&temp, b); //真正复制数据 cvCopy使用前要先开辟内存空间
cvCopy与cvCloneImage使用区别:
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。cvCopy会把src中的数据复制到dst的内存中。
cvCloneImage的原型是:
IplImage* cvCloneImage( const IplImage* image );
在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好image里面的数据,然后把这段内存中的数据返回给你。
clone是把所有的都复制过来,也就是说不论你是否设置Roi,Coi等影响copy的参数,clone都会原封不动的克隆过来。
copy就不一样,只会复制ROI区域等。用clone复制之后,源图像在内存中消失后,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变
//使用Mat的构造函数:Mat::Mat(const IplImage* img, bool copyData=false); 默认情况下copyData为falseIplImage* srcImg = cvLoadImage("Lena.jpg");//注意:以下三种效果一致,均为浅拷贝Mat M(srcImg);Mat M(srcImg, false);Mat M = srcImg;//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)Mat M(srcImg, true);
//注意:浅拷贝 - 同样只是创建图像头,而没有复制数据Mat M;IplImage img = M;IplImage img = IplImage(M);//深拷贝cv::Mat img2;IplImage imgTmp = img2;IplImage *input = cvCloneImage(&imgTmp);
6、IplImage与CvMat互转
//法一:cvGetMat函数IplImage* img;CvMat temp;CvMat* mat = cvGetMat(img, &temp); //深拷贝//法二:cvConvert函数CvMat *mat = cvCreateMat(img->height, img->width, CV_64FC3); //注意height和width的顺序cvConvert(img, mat); //深拷贝
//法一:cvGetImage函数CvMat M;IplImage* img = cvCreateImageHeader(M.size(), M.depth(), M.channels());cvGetImage(&M, img); //深拷贝:函数返回img//也可写成CvMat M;IplImage* img = cvGetImage(&M, cvCreateImageHeader(M.size(), M.depth(), M.channels()));//法二:cvConvert函数CvMat M;IplImage* img = cvCreateImage(M.size(), M.depth(), M.channels());cvConvert(&M, img); //深拷贝
#pragma once#ifndef CVVIMAGE_CLASS_DEF#define CVVIMAGE_CLASS_DEF#include "opencv2/opencv.hpp"/* CvvImage class definition */class CvvImage : public Mat{public: CvvImage(); virtual ~CvvImage(); CvvImage(Mat& mat); /* Create image (BGR or grayscale) */ virtual bool Create( int width, int height, int bits_per_pixel ); /* 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, Rect r ); #if defined WIN32 || defined _WIN32 virtual bool LoadRect( const char* filename, int desired_color, RECT r ) { return LoadRect( filename, desired_color, Rect( 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( Mat& image, int desired_color = -1 ); /* width and height of ROI */ int Width() { return cols; }; int Height() { return rows;}; int Bpp() { return ((8<<((1<<depth()/2)>>1)) )*channels(); }; /* 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};typedef CvvImage CImage;#endif
- CvvImage类在MFC中使用的说明
- CvvImage类在MFC中使用的说明
- MFC中CvvImage类的应用
- 利用CvvImage类在MFC控件中显示图片
- [转]CvvImage类以及在MFC中显示IplImage图像的方法
- CvvImage类以及在MFC中显示IplImage图像的方法(转)
- CvvImage类以及在MFC中显示IplImage图像的方法
- CvvImage类以及在MFC中显示IplImage图像的方法
- MFC下使用CvvImage在子对话框(非主对话框)中无法显示图片的解决方法
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- 在OpenCV2.2后的版本中没有CvvImage类的解决方法(及出现错误:IntelliSense: 未定义标识符 "CvvImage")
- OpenCV2没有了CvvImage,抄下低版本的CvvImage,可用于MFC中。
- MFC中在对话框中显示图片(从此摆脱opencv升级后无CvvImage的烦恼)
- 使用CvvImage类,实现MFC对话框显示视频
- OpenCV中CvvImage类的具体实现
- mfc+CvvImage类 显示工程目录下的图片
- opencv2.3.1中使用CvvImage
- 华为OJ-求车速
- IBM openblockchain学习(三)--Ledger源码分析
- 关于<lable></lable>标签的理解
- Android开发:创建一个可供编辑的图片(bitmap)
- 结构型设计模式-享元模式
- CvvImage类在MFC中使用的说明
- ios消息转发机制
- (1)Two Sum
- 高于均分的学生 oj
- 小白笔记--------------------矩阵连乘问题(求怎么加括号运算量最小)
- 彻底解决Spring mvc乱码
- 在链接里使用thinkphp的U方法
- Oracle 查询
- BorderLayout布局