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爲閥值

發佈了4 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章