vc MFC使用OPenCV常用函数搜集
来源:百度文库 编辑:神马文学网 时间:2024/04/30 13:45:51
vc MFC使用OPenCV常用函数搜集 ================================1 显示IplImage到指定窗口==================================
public:
BITMAPINFO *m_pBITMAPINFO_24;// 24位真彩图BITMAPINFO格式固定,提前创建1次并保存指针
BITMAPINFO *m_pBITMAPINFO_08;// 8位灰度图BITMAPINFO格式固定,提前创建1次并保存指针
void DrawImgToWnd(CWnd *pWnd, IplImage *pImg)
{
RECT rc;
pWnd->GetClientRect(&rc);
CDC *pDC = pWnd->GetDC();
HDC hdc = pDC->GetSafeHdc();
if(pImg->nChannels == 3) // 3通道
{
m_pBITMAPINFO_24->bmiHeader.biWidth = rc.right;
m_pBITMAPINFO_24->bmiHeader.biHeight = rc.bottom;//这里负值表示显示镜像位图
::StretchDIBits(
hdc,
0, 0, rc.right, rc.bottom,
0, 0, pImg->width, pImg->height,
pImg->imageData, m_pBITMAPINFO_24, DIB_RGB_COLORS, SRCCOPY);
}
else // 单通道
{
m_pBITMAPINFO_24->bmiHeader.biWidth = rc.right;
m_pBITMAPINFO_24->bmiHeader.biHeight = rc.bottom;//这里负值表示显示镜像位图
::StretchDIBits(
hdc,
0, 0, rc.right, rc.bottom,
0, 0, pImg->width, pImg->height,
pImg->imageData, m_pBITMAPINFO_08, DIB_RGB_COLORS, SRCCOPY);
}
pWnd->ReleaseDC(pDC);
}
==================================2 位图缩放==================================
上面的函数DrawImgToWnd只能原比例显示位图,但实际中通常是要缩放后显示的GDI自带的插值算法很慢
::SetStretchBltMode(hdc, HALFTONE);//名声很不好的一个函数
GDI+自带的插值算法很快,但GDI+封装的太厉害,没有导出任何接口,使用不方便,效率因此而下降,也可能我没找到..
OpenCV的插值算法也非常快,并且给出单独的函数(源码都有),使用方便,如果合理使用,比GDI+稍快
当然你也可以自己写插值算法...........下面是OpenCV缩放位图的函数:
IplImage *pImg_24 = cvCreateImage(cvSize(WND_WIDTH, WND_HEIGHT),8, 3);//创建与窗口同大小的空图
cvResize(pImg, pImg_24, CV_INTER_LINEAR);//把源图缩放至窗口大小
DrawImgToWnd(CWnd *pWnd, pImg_24);//上面写的函数,显示与窗口同尺寸的位图
cvReleaseImage(&pImg);//释放内存
如果,pImg_24我们事先定义成公共变量并初始化,将省去每次缩放重复创建释放内存的操作,这样做就可以比GDI+快了================================== 3 图片读取与转换 ==================================
// cvLoadImage第二个参数 -1:读取图像的原通道数 0:强制灰度图 1: 读取彩色图
IplImage *pImgSrc = cvLoadImage("清晰面包.bmp",-1);
cvSaveImage("c:\\demo.bmp", pImgSrc);
cvSaveImage("c:\\demo.png", pImgSrc);
cvSaveImage("c:\\demo.jpg", pImgSrc);
cvSaveImage("c:\\demo.tiff", pImgSrc);
cvReleaseImage(&pImgSrc);
OpenCV貌似不支持gif文件================================== 4 截取指定部分图像 ==================================
IplImage* cvGetSubImage(IplImage *pImgSrc, CvRect rc)
{
cvSetImageROI(pImgSrc,rc); // 选中指定部分
IplImage *pImgDst = cvCreateImage(cvSize(rc.width, rc.height), pImgSrc->depth, pImgSrc->nChannels);
cvCopy(pImgSrc, pImgDst); // copy源图选中部分至新图
cvResetImageROI(pImgSrc); // 源图取消选中
return pImgDst;
}================================== 5 几个常用的小函数 ==================================cvSet(pImg,cvScalarAll(255));//把灰度图置成全白
cvSet(pImg,cvScalarAll(0));//把灰度图置成全黑
cvCvtColor(pImgSrc, pImgDst, CV_BGR2GRAY);//灰度化
cvThreshold(pImgSrc,pImgDst,141,255,CV_THRESH_BINARY); //灰度图的二值化,141为阀值
public:
BITMAPINFO *m_pBITMAPINFO_24;// 24位真彩图BITMAPINFO格式固定,提前创建1次并保存指针
BITMAPINFO *m_pBITMAPINFO_08;// 8位灰度图BITMAPINFO格式固定,提前创建1次并保存指针
void DrawImgToWnd(CWnd *pWnd, IplImage *pImg)
{
RECT rc;
pWnd->GetClientRect(&rc);
CDC *pDC = pWnd->GetDC();
HDC hdc = pDC->GetSafeHdc();
if(pImg->nChannels == 3) // 3通道
{
m_pBITMAPINFO_24->bmiHeader.biWidth = rc.right;
m_pBITMAPINFO_24->bmiHeader.biHeight = rc.bottom;//这里负值表示显示镜像位图
::StretchDIBits(
hdc,
0, 0, rc.right, rc.bottom,
0, 0, pImg->width, pImg->height,
pImg->imageData, m_pBITMAPINFO_24, DIB_RGB_COLORS, SRCCOPY);
}
else // 单通道
{
m_pBITMAPINFO_24->bmiHeader.biWidth = rc.right;
m_pBITMAPINFO_24->bmiHeader.biHeight = rc.bottom;//这里负值表示显示镜像位图
::StretchDIBits(
hdc,
0, 0, rc.right, rc.bottom,
0, 0, pImg->width, pImg->height,
pImg->imageData, m_pBITMAPINFO_08, DIB_RGB_COLORS, SRCCOPY);
}
pWnd->ReleaseDC(pDC);
}
==================================2 位图缩放==================================
上面的函数DrawImgToWnd只能原比例显示位图,但实际中通常是要缩放后显示的GDI自带的插值算法很慢
::SetStretchBltMode(hdc, HALFTONE);//名声很不好的一个函数
GDI+自带的插值算法很快,但GDI+封装的太厉害,没有导出任何接口,使用不方便,效率因此而下降,也可能我没找到..
OpenCV的插值算法也非常快,并且给出单独的函数(源码都有),使用方便,如果合理使用,比GDI+稍快
当然你也可以自己写插值算法...........下面是OpenCV缩放位图的函数:
IplImage *pImg_24 = cvCreateImage(cvSize(WND_WIDTH, WND_HEIGHT),8, 3);//创建与窗口同大小的空图
cvResize(pImg, pImg_24, CV_INTER_LINEAR);//把源图缩放至窗口大小
DrawImgToWnd(CWnd *pWnd, pImg_24);//上面写的函数,显示与窗口同尺寸的位图
cvReleaseImage(&pImg);//释放内存
如果,pImg_24我们事先定义成公共变量并初始化,将省去每次缩放重复创建释放内存的操作,这样做就可以比GDI+快了================================== 3 图片读取与转换 ==================================
// cvLoadImage第二个参数 -1:读取图像的原通道数 0:强制灰度图 1: 读取彩色图
IplImage *pImgSrc = cvLoadImage("清晰面包.bmp",-1);
cvSaveImage("c:\\demo.bmp", pImgSrc);
cvSaveImage("c:\\demo.png", pImgSrc);
cvSaveImage("c:\\demo.jpg", pImgSrc);
cvSaveImage("c:\\demo.tiff", pImgSrc);
cvReleaseImage(&pImgSrc);
OpenCV貌似不支持gif文件================================== 4 截取指定部分图像 ==================================
IplImage* cvGetSubImage(IplImage *pImgSrc, CvRect rc)
{
cvSetImageROI(pImgSrc,rc); // 选中指定部分
IplImage *pImgDst = cvCreateImage(cvSize(rc.width, rc.height), pImgSrc->depth, pImgSrc->nChannels);
cvCopy(pImgSrc, pImgDst); // copy源图选中部分至新图
cvResetImageROI(pImgSrc); // 源图取消选中
return pImgDst;
}================================== 5 几个常用的小函数 ==================================cvSet(pImg,cvScalarAll(255));//把灰度图置成全白
cvSet(pImg,cvScalarAll(0));//把灰度图置成全黑
cvCvtColor(pImgSrc, pImgDst, CV_BGR2GRAY);//灰度化
cvThreshold(pImgSrc,pImgDst,141,255,CV_THRESH_BINARY); //灰度图的二值化,141为阀值
vc MFC使用OPenCV常用函数搜集
MFC中常用类,宏,函数介绍
VC常用数据类型的使用
VC /MFC 源码下载
MFC全局函数::AfxBeginThread
MFC全局函数::AfxBeginThread
VC常用数据类型使用转换详解
学习VC MFC开发必须了解的常用宏和指令
OpenCV 中文论坛 ? 查看主题 - C#中使用OpenCV
OpenCV 中文论坛 ? 查看主题 - C#中使用OpenCV
卓为VC——界面/窗口——MFC控件 状态条的简单介绍及使用 CStatusBar
卓为VC——界面/窗口——MFC控件 状态条的简单介绍及使用 CStatusBar
用独立线程解决弹出模态对话框后执行自定义函数问题 - VC/MFC - 提供最全面实用的J...
iso9660文件格式 VC/MFC / Visual C 资源
VC++内存泄漏定位(依赖MFC)
求助:软件加密方式! - VC/MFC / 基础类
VC++中MFC窗口对象的清除
C++、VC++、MFC的区别和联系
vc中如何调用webservice? VC/MFC / 进程/线程/DLL
使用MFC的数组类
[转] MFC CListCtrl 使用介绍
[转] MFC CListCtrl 使用介绍
Excel常用快捷键搜集
VC常用快捷键