完整vs2010+MFC+Opencv,图片显示过程细节(代码详细解析)

先把读取图片显示的源代码贴在下面:具体每行代码详细信息在最后

CDC *pDC = GetDlgItem(IDC_Gray_Picture_1)->GetDC();//  HDC hdc= pDC->GetSafeHdc();                        CRect rect;

GetDlgItem(IDC_Gray_Picture_1)->GetClientRect(&rect);

/* rect.left=100;

  rect.top=100;

  rect.right =200;

  rect.bottom = 250;

  */

  CvvImage cimg;

  IplImage *src;

  src = cvLoadImage("res\\me.jpg",-1);  cimg.CopyOf(src,src->nChannels);

  cimg.DrawToHDC(hdc,&rect);

  ReleaseDC( pDC );

  cimg.Destroy();

 

下面资料是代码辅助资料:

opencv1.0时代基于C语言接口而建图像储存格式IplImage*(这就是图像矩阵的指针,简单来说就是代表一个图片),退出时要进行release掉,会涉及很多内存管理的问题。

opencv2.0采用mat类作为数据结构进行图像存取,利用一些imread,imwrite,imshow等函数

(opencv中的C++类和函数都是定义在命名空间cv之内,在代码开头位置加上using namespace cv)

Mat srcImage  =imread("dota.jpg"),代表工程目录下把一幅名为dota.jpg的图像载入到Mat类型的srcImage变量中。



关于C++(句柄和指针)句柄其实就是一种指向某种资源的指针,他与真正指针有所不同,指针是内存中的地址,有指针就可以自由的修改数据。从windows角度来说,并不希望修改起内部的数据结构就给每个使用函数的内存区域指定了一个句柄,就可以直接调用API函数利用这个句柄来说明操作哪段内存。

如果要是操作一个窗口,窗口句柄值是与1个长整数,每个窗口都用一个句柄来表示,这样句柄是不会重复的



CDC类定义的是设备上下文对象类,通过这个类对象提供显示器或打印机设备上下文的成员函数,以及处理和窗口客户区对应的显示上下文的成员,通过CDC对象的成员函数进行所有的绘图,安全型设备接口(GDI)以及处理颜色和调它为获取和设置绘图属性、映射、窗口拓展,使用CDC对象是要构造它,然后调用和他平等,使用设备上下文window函数的成员函数。



     CDC *pDC = GetDlgItem(IDC_Gray_Picture_1)->GetDC();获取这个控件设备环境,为后期进行图形方面的操作

根据上面控件ID获取对话框内控件指针

GetDlgItem(IDC_Gray_Picture_1)获取控件对象,在利用GetDC()函数由窗口对象得到DC在控件中画图

     HDC hdcpDC->GetSafeHdc(); pDC是类指针,通过pDC获取HDC

这两句要结合在一起看首先HDC是句柄,CDC是MFC封装的windows类,HDC是windows的一种数据类型,是设备描述句柄,CDC是MFC一个类,封装了所有的HDC的操作

     CRect rect;ret结构定义了一个矩形框左上角以及右下角坐标,windows编程中,这个对象用来存储成对出现的参数

    GetDlgItem(IDC_Gray_Picture_1)->GetClientRect(&rect); 

获取窗口客户区的坐标函数原型在win32 SDK,该API函数原型为

     BOOL GetClientRect(

     HWND hWnd,//窗口句柄

     LPRECT lpRect//客户区坐标);

    CvvImage cimg;

    IplImage *src 

    src = cvLoadImage("res\\me.jpg",-1);

    cimg.CopyOf(src,src->nChannels);//复制图片,nChannels图像通道数,调试时候发现其默认是3通道

    cimg.DrawToHDC(hdc,&rect);//将图片绘制到显示控件的指定区域内

//CvvImage::DrawToHDC(HDChDCst, RECT * pDstRect)

//给绘制的ROI区域到pDstRect,如果图像大小和pDstRect不一致,图像就会拉伸压缩

ROI,region of interest:感兴趣区域

这是一个测试样代码:

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);

    ReleaseDCpDC );

    cimg.Destroy();

下面这幅图是修改rect参数可以准确的移动图片位置,一般默认在符合控件的位置

 完整vs2010+MFC+Opencv,图片显示过程细节(代码详细解析)_第1张图片完整vs2010+MFC+Opencv,图片显示过程细节(代码详细解析)_第2张图片

                   

 

你可能感兴趣的:(完整vs2010+MFC+Opencv,图片显示过程细节(代码详细解析))