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為閥值
posted on 2009-12-12 23:31
deercoder 閱讀(1798)
評論(0) 編輯 收藏 引用 所屬分類:
OpenCV / OpenGL