影象處理基礎及OpenCV實現(一)
最近學習數字影象處理基礎及OpenCV實現這本書,寫一點東西記錄所學的內容。。
一、 開啟影象與視訊
開啟影象
用到了OpenCV中的結構體IplImage,
函式IplImage* cvLoadImage( const char* filename, int iscolor); 其中,filename 是待載入影象的名稱,包括影象的副檔名;iscolor是一個輔助引數項,可選正數、零和負數三種值,正數表示作為三通道影象載入,零表示該影象作為單通道影象,負數表示載入影象的通道數由影象檔案自身決定[1](百度)。
在MFC中使用的類CvvImage, 類中方法: 匯入影象 Void CopyOf( IplImage* img, int desired_color = -1 );或void CopyOf( CvvImage& image, int desired_color = -1 ); 其中,image是已載入的影象,desired_color與載入函式一樣。 輸出到DC Void DrawToHDC( HDC hDCDst, RECT* pDstRect ); 其中hDCDst繪圖DC,pDstRect是繪製的矩陣區域。
程式碼如下:
CFileDialog dlg(TRUE, _T("*.bmp"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("image files(*.bmp;*.jpg)|*.bmp;*.jpg|All Files(*.*)|*.*||"), NULL); dlg.m_ofn.lpstrTitle = _T("Open Image"); dlg.m_ofn.lpstrInitialDir = _T("..//"); if (dlg.DoModal() != IDOK) return; CString m_strPath = dlg.GetPathName(); m_ipl = cvLoadImage(m_strPath); if (!m_ipl) return; CDC* pDC = GetDlgItem(IDC_PIC)->GetDC(); HDC hDC = pDC->GetSafeHdc(); CvvImage cimg; cimg.CopyOf(m_ipl); CRect rect; GetDlgItem(IDC_PIC)->GetClientRect(&rect); cimg.DrawToHDC(hDC, &rect); ReleaseDC(pDC);
測試如下
開啟視訊
開啟視訊的方式是先獲取視訊檔案資訊,再得到視訊每一幀的影象,在用開啟影象的方式開啟每一幀,迴圈依次播放。
用到了OpenCv中的結構體CvCapture 函式CvCapture* cvCreateFileCapture(const char* mov)從原始檔中讀入avi檔案,返回指向CvCapture結構體的指標。 函式IplImage* cvQueryFrame(CvCapture* capture) 從檔案中抓取一幀,返回這一幀的影象資訊到IplImage結構體中,並將下一幀的資訊載入記憶體。
程式碼如下:
CFileDialog dlg(TRUE, _T("*.avi"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("image files(*.avi)|*.avi|All Files(*.*)|*.*||"), NULL); dlg.m_ofn.lpstrTitle = _T("Open Video"); dlg.m_ofn.lpstrInitialDir = _T("..//"); if (dlg.DoModal() != IDOK) return; CString m_strPath = dlg.GetPathName(); CvCapture* capture = cvCreateFileCapture(m_strPath); IplImage* frame; CvvImage cimg; CDC* pDC = GetDlgItem(IDC_PIC)->GetDC(); HDC hDC = pDC->GetSafeHdc(); CRect rect; GetDlgItem(IDC_PIC)->GetClientRect(&rect); while (1) { frame = cvQueryFrame(capture); if(!frame) { break; } cimg.CopyOf(frame); cimg.DrawToHDC(hDC, &rect); } ReleaseDC(pDC); cvReleaseImage(&frame); cvReleaseCapture(&capture);
測試輸出 注:cvCreateFileCapture函式會出現返回值為NULL的情況,解決方式是下載XviD codec 解碼器,http://www.xvidmovies.com/codec/ ,安裝後使用其中的 MiniConvert 程式將原視訊轉化為能識別的格式。