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、编译运行。
第一部分(创建显示图像区域)
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、编译运行。
相关文章推荐
- Opencv学习笔记
- Opencv学习笔记-常用函数
- OpenCV2学习笔记(十二):特征提取算法SIFT与SURF
- 基础学习笔记之opencv(1):opencv中facedetect例子浅析
- OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度
- opencv 学习笔记集锦
- OpenCV学习笔记:如何扫描图像、利用查找表和计时
- OpenCV学习笔记大集锦
- OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五
- OpenCV学习笔记_图片边缘检测
- 基础学习笔记之opencv(3):haartraining生成.xml文件过程
- 学习opencv笔记(网络)
- opencv学习笔记 根据滑动条参数检测轮廓
- OpenCV(C++接口)学习笔记4-Mat::operator = 的陷阱
- OpenCV学习笔记之一:OpenCV中显示图片(VS2010+OpenCV3.0版本)
- opencv [c++版] 学习笔记(1) 显示图像及播放视频
- opencv_python学习笔记九
- opencv_python学习笔记十六
- opencv计算机视觉学习笔记三
- OpenCV学习笔记(九)——2维特征Feature2D