用vc6.0进行开发真的有点蛋疼,在实现jpeg图片的播放,vc6.0的picture控件居然只支持位图>_<
开始想法是在程序中加一个编码过程,边读图边解码边显示,先将JPEG图片转化为位图再显示,但代价是在OPENCV中的自带的函数支持编解码,但要先写下来,所以读写再度时间较长无法满足实时性的要求;
第二种方法是用VTK中带的vtkJPEGReader类,在MFC中创建一个VTK的自定义控件,后读入显示,但结果是读入显示太慢,屏幕会一闪一闪的,速度太慢,查资料说要用双缓冲的技术;
后继续找资料,找到了cvvImage的类,这个类功能有点强;
Opencv vc6.0的配置直接网上搜吧,这里不在累述
建立一个界面,如图:
简单地包含一个Picture的控件和一个按钮控件
设置Picture控件的ID为:IDC_Picture
往Dlg.c文件中加入opencv的头文件:
#include "cv.h"
#include "highgui.h"
在Debug运行时还应加入highgui100.dll到目录下
接着对按钮继续消息相应函数的编写:
IplImage *image=NULL; //原始图像
char filename[128];
for(int i=2;i<300;i++)
{
sprintf(filename,"5//%d.jpg",i);//""中间填写图片的路径
//if(image)
// cvReleaseImage(&image);
image = cvLoadImage(filename); //显示图片
cvWaitKey(3);
DrawPicToHDC(image, IDC_Picture);
Sleep(30);
cvReleaseImage(&image);
}
在MFC的框架下cvWaitKey();这一函数无法延时;
用for(;;)循环也不能进行延时;
经测试Sleep()可以进行延时
void CPicturesDlg::DrawPicToHDC(IplImage *img, UINT ID)
{
CDC *pDC = GetDlgItem(ID)->GetDC();
HDC hDC= pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
// cvWaitKey(30000000);
CvvImage cimg;
cimg.CopyOf(img);
cimg.DrawToHDC(hDC,&rect);
//cvWaitKey(30000000);
ReleaseDC(pDC);
}
结果是应该能达到二十多帧,
结果:
双缓冲的技术可能马上就会用到>_<
除非有特殊要求,劲量还是不要用VC6.0