先看图:
拉伸显示
居中显示
原始大小显示
显示视频:
实现图片显示,只需要两句话:
只需要包含一个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:延迟时间ÿ