最近学习数字图像处理基础及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 程序将原视频转化为能识别的格式。