图像处理基础及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实现(一)

打开视频

打开视频的方式是先获取视频文件信息,再得到视频每一帧的图像,在用打开图像的方式打开每一帧,循环依次播放。

用到了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);

测试输出
图像处理基础及OpenCV实现(一)
注:cvCreateFileCapture函数会出现返回值为NULL的情况,解决方式是下载XviD codec 解码器,http://www.xvidmovies.com/codec/ ,安装后使用其中的 MiniConvert 程序将原视频转化为能识别的格式。