MFC+OPENCV实现JPEG图片的播放

  1. 云栖社区>
  2. 博客>
  3. 正文

MFC+OPENCV实现JPEG图片的播放

night李 2017-03-16 22:15:00 浏览1639
展开阅读全文

用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
这里写图片描述

网友评论

登录后评论
0/500
评论
night李
+ 关注