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

打开视频

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

用到了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实现(一)_第2张图片
注:cvCreateFileCapture函数会出现返回值为NULL的情况,解决方式是下载XviD codec 解码器,http://www.xvidmovies.com/codec/ ,安装后使用其中的 MiniConvert 程序将原视频转化为能识别的格式。

你可能感兴趣的:(图像处理基础及OpenCV实现(一))