1. 程式人生 > >影象處理基礎及OpenCV實現(一)

影象處理基礎及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 程式將原視訊轉化為能識別的格式。