您的位置:首页 > 运维架构

opencv学习笔记(一)

2012-11-15 19:50 197 查看
对话框界面上直接显示图像(含openCV内容)

第一部分(创建显示图像区域)

1、创建对话框工程mymfc

2、在第三步中选择“As a statically linked library”

3、设置OpenCV环境变量

4、在mymfc.h文件中添加如下代码:

#include “cv.h”

#include “highgui.h”

#define IMAGE_WIDTH 256

#define IMAGE_HEIGHT 256 //假设要显示的图像是256*256

#define IMAGE_CHANNELS 3

5、为CmymfcDlg类添加成员变量IplImage* TheImage

6、在mymfcDlg.h中放置如下代码到Protected下面:

BITMAPINFO* bmi;

BITMAPINFOHEADER* bmih;

RGBQUAD* palette;

Unsigned int buffer[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256];

7、双击CmymfcDlg类中的OnInitDialog(),在“// TODO: Add extra initialization here”下面添加如下代码:

//创建IPL图像

CvSize ImgSize;

ImgSize.width=IMAGE_WIDTH;

ImgSize.height=IMAGE_HEIGHT;

TheImage=cvCreateImage(ImgSize,IPL_DEPTH_8U,IMAGE_CHANNELS);

//下面这段语句不是必需的,这里将在对话框中显示一幅创建的图像

if(TheImage->nChannels==1)//对灰度图像

{

float dx=(TheImage->width/256.0f);

for(int w=0;w<TheImage->width;w++)

for(int h=0;h<TheImage->height;h++)

{

//复制数据到IPL

TheImage->imageData[TheImage->height*w+h]=(char)(w/dx);

}

}

else if(TheImage->nChannels==3)//对RGB图像

{

IplImage* Temp=cvCreateImage(ImgSize,IPL_DEPTH_8U,1);

int w;

float dx=(Temp->width/256.0f);

for(w=0;w<Temp->width;w++)

for(int h=0;h<Temp->height;h++)

Temp->imageData[Temp->height*w+h]=(char)(w/dx);

cvSetImageCOI(TheImage,1);//选择蓝色通道

cvCopy(Temp,TheImage);

for(w=0;w<Temp->width;w++)

for(int h=0;h<Temp->height;h++)

Temp->imageData[Temp->height*w+h]=(char)(255-w/dx);

cvSetImageCOI(TheImage,2);//选择绿色通道

cvCopy(Temp,TheImage);

for(w=0;w<Temp->width;w++)

for(int h=0;h<Temp->height;h++)

Temp->imageData[Temp->height*w+h]=(char)(w/dx);

cvSetImageCOI(TheImage,3);//选择红色通道

cvCopy(Temp,TheImage);

cvReleaseImage(&Temp);

}

//下面几行用来初始化BMP的显示缓存,这是必需的

bmi=(BITMAPINFO*)buffer;

bmih=&(bmi->bmiHeader);

memset(bmih,0,sizeof(*bmih));

bmih->biSize=sizeof(BITMAPINFOHEADER);

bmih->biWidth=IMAGE_WIDTH;

bmih->biHeight=-IMAGE_HEIGHT;

bmih->biPlanes=1;

bmih->biCompression=BI_RGB;

bmih->biBitCount=8*TheImage->nChannels;

palette=bmi->bmiColors;

if(TheImage->nChannels==1)

{

for(int i=0;i<256;i++)

{

palette[i].rgbBlue=palette[i].rgbGreen=palette[i].rgbRed=(BYTE)i;

palette[i].rgbReserved=0;

}

}

8、为CmymfcDlg类添加成员函数 void DisplayMyData(),添加如下语句:

CPaintDC dc(this);

CDC* pDC=&dc;

int res=StretchDIBits(pDC->GetSafeHdc(),

0,

0,

Int(IMAGE_WIDTH),

Int(IMAGE_HEIGHT),

0,

0,

IMAGE_WIDTH,

IAMGE_HEIGHT,

TheImage->imageData,

(BITMAPINFO*)bmi,

DIB_RGB_COLORS,

SRCCOPY);

//更新窗口,重新绘制

RedrawWindow(

NULL,

NULL,

RDW_INVALIDATE

);

9、在OnPaint()函数的else 部分中,在“CDialog::OnPaint();”前面添加如下代码:

DisplayMyData();

10、在InitInstance()函数的“//TODO:”后面添加如下代码用来释放图像内存:

cvReleaseImage(&dlg.TheImage);

11、编译运行。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Image interface