OpenCV系列1-简单高效:MFC显示图片、播放视频

先看图:
拉伸显示
这里写图片描述

居中显示
这里写图片描述

原始大小显示
这里写图片描述

显示视频:
这里写图片描述



实现图片显示,只需要两句话:
这里写图片描述
这里写图片描述

只需要包含一个h文件:
这里写图片描述

调整显示方式:
这里写图片描述

下面是CvImgCtrl.h的源代码,复制保存下来即可用,或者也可以下载demo,不要积分
控件采用的是双缓冲绘图,显示效率很高,不会闪烁,支持视频、图片的显示

/************************************************************************/
/*                              OpenCV MFC图像显示控件 v1.0
/*    该控件很容易集成到mfc中显示,具体用法见demo:
/*                                                                               Wish: 512690069
/*                                                                      2016年4月6日 15:28:58 
/************************************************************************/

#pragma once

#include <cv.h>
#include <highgui.h>
#include <afxwin.h>

//自定义消息基础值
#define MsgBase                 (WM_USER + 0xA0)
#define MsgLBDown           (MsgBase + 0)                   //鼠标左键被按下的消息
#define MsgLBUp                 (MsgBase + 1)                   //左键抬起来
#define MsgRBDown           (MsgBase + 2)                   //右键按下
#define MsgMove             (MsgBase + 3)                   //鼠标移动

#define MsgMBDown           (MsgBase + 4)                   //中键按下
#define MsgMBUp             (MsgBase + 5)                   //中键抬起

#define MsgKeyDown          (MsgBase + 6)                   //按下某个键盘按键  
#define MsgDragFile             (MsgBase + 7)                   //拖动文件到控件上去的时候

#define MsgVideoStart           (MsgBase + 8)                   //视频开始的时候
#define MsgVideoOver            (MsgBase + 9)                   //视频结束了


//得到一帧视频画面了,具体看demo
//1、在dlg的头文件中写:afx_msg LRESULT onFrame(WPARAM wp, LPARAM lp);声明
//2、在dlg的BEGIN_MESSAGE_MAP里面写:ON_MESSAGE(MsgVideoFrame, onFrame)
//3、在dlg的cpp中写:
/*
LRESULT CdemoDlg::onFrame(WPARAM wp, LPARAM lp){
    Mat frame((IplImage*)lp, false);
    flip(frame, frame, -1);
    //这里就是在处理每一帧的图像了,类似的MsgVideoPreDisplay消息也是这么来的
    return 0;
}
*/
#define MsgVideoFrame           (MsgBase + 0x0A)            
#define MsgVideoPreDisplay  (MsgBase + 0x0B)        //视频一帧画面准备显示了,他会在MsgVideoFrame之后

//控件被单击消息
#define MsgClick                            (MsgBase + 0x0C)

//内部消息,内部使用,不需要理会
#define InnerMsgBase                    (MsgBase + 0xF0)                    //基本消息起点
#define InnerMsgVideoFrame      (InnerMsgBase + 0)              //接受到一帧画面

//图像显示控件
class CvImgCtrl : public CWnd
{
    DECLARE_DYNAMIC(CvImgCtrl)

public:
    //视图缩放类型
    enum ResizeType
    {
        ResizeType_Raw,                 //原始大小,以左上角为准,图像多大就多大,不做缩放
        ResizeType_CenterResize,        //居中缩放,图像宽高等比例,画面居中
        ResizeType_Tensile              //拉伸,宽高拉伸到控件一样大
    };

    //视频播放的状态
    enum VideoState{
        VideoState_Stop,                    //视频停止了
        VideoState_Playing,             //视频播放中
        VideoState_Pause                    //视频暂停了
    };

public:
    CvImgCtrl();
    virtual ~CvImgCtrl();

    //链接到对话框上的控件,链接过后,就被这个类接管了,他会负责将画面绘制到控件上去
    //idd:控件的id
    //parent:父控件的指针,比如在dialog里面,给this就行了
    BOOL linkDlgItem(UINT idd, CWnd* parent);

    //创建一个控件,如果需要动态创建,就调用这个创建函数,而不是CWnd的创建函数
    //pParent:父级的指针,一般给dialog的this指针就好了
    //rcPos:控件所在位置,可以直接给CRect()也行,然后在OnSize里边调整宽高,或者给指定值也行
    //autoDelete:如果CvImgCtrl* m_show,这种,指针,采用new的方式得到的控件,而不是实体变量,那么当这个参数给true的时候,控件销毁时
    //                    会自己回收内存(delete this),也就是你就不用手动的去delete他了
    //resizeType:缩放方式,当显示图像和窗口大小不一致时,该如何缩放,有3种方式,看枚举类型ResizeType的备注
    //defaultColor:默认颜色,即背景默认色,比如居中显示的时候,四周会留空,该是什么颜色,或者刚创建完毕时是什么颜色等
    bool create(CWnd* pParent, CRect rcPos, bool autoDelete = false, ResizeType resizeType = ResizeType_Raw, CvScalar defaultColor = cvScalarAll(255));

    //开始视频,这个控件内置了VideoCapture,所以这里直接可以调用openVideo来打开视频
    //file:视频文件路径,直接是VideoCapture.open,如果失败格式不支持,那就去看VideoCapture
    //waitTime:延迟时间ÿ
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值