一:首先创建滚动条:

  1. 创建一个基于对话框的MFC工程,名称设置为“Example26”。
  2. 在自动生成的对话框模板IDD_EXAMPLE26_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控 件、“OK”按钮和“Cancel”按钮。添加一个Horizontal Scroll Bar控件,ID设置为IDC_HORI_SCROLLBAR。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“滚动块当前位置:”,编辑框的ID设为IDC_HSCROLL_EDIT,Read Only属性设为True。此时的对话框模板如下图:
  3. 为滚动条IDC_HORI_SCROLLBAR添加CScrollBar类型的控件变量m_horiScrollbar。
  4. 在对话框初始化时,我们需要设置滚动条的滚动范围和初始位置,并在编辑框中显示初始位置,那么需要修改CExample26Dlg::OnInitDialog()函数为:

BOOL CExample26Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application’s main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// 设置水平滚动条的滚动范围为1到100
m_horiScrollbar.SetScrollRange(1, 100);
// 设置水平滚动条的初始位置为20
m_horiScrollbar.SetScrollPos(20);
// 在编辑框中显示20
SetDlgItemInt(IDC_HSCROLL_EDIT, 20);
return TRUE; // return TRUE unless you set the focus to a control
}

  1. 现在滚动条还不能正常滚动,并且编辑框中数字也不随滚动改变。根据上面所讲,我们可以重载CExample26Dlg类的OnHScroll函数。具体操作为,在CExample26Dlg类的属性页面的工具栏上点“Messages”按钮,找到WM_HSCROLL消息,添加响应函数就可以了。OnHScroll函数重写后如下:

void CExample26Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int pos = m_horiScrollbar.GetScrollPos(); // 获取水平滚动条当前位置
switch (nSBCode)
{
// 如果向左滚动一列,则pos减1
case SB_LINELEFT:
pos -= 1;
break;
// 如果向右滚动一列,则pos加1
case SB_LINERIGHT:
pos += 1;
break;
// 如果向左滚动一页,则pos减10
case SB_PAGELEFT:
pos -= 10;
break;
// 如果向右滚动一页,则pos加10
case SB_PAGERIGHT:
pos += 10;
break;
// 如果滚动到最左端,则pos为1
case SB_LEFT:
pos = 1;
break;
// 如果滚动到最右端,则pos为100
case SB_RIGHT:
pos = 100;
break;
// 如果拖动滚动块滚动到指定位置,则pos赋值为nPos的值
case SB_THUMBPOSITION:
pos = nPos;
break;
// 下面的m_horiScrollbar.SetScrollPos(pos);执行时会第二次进入此函数,最终确定滚动块位置,并且会直接到default分支,所以在此处设置编辑框中显示数值
default:
SetDlgItemInt(IDC_HSCROLL_EDIT, pos);
return;
}
// 设置滚动块位置
m_horiScrollbar.SetScrollPos(pos);
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

  1. 编译运行程序,弹出结果对话框,可以自己拖动滚动块看是否能正常滚动,并且编辑框中也显示了正确的数值。效果如下:

二:新建类, 在.h的头文件添加声明

#pragma once
#ifndef CIRCLE_H
#define CIRCLE_H
#include <opencv2/opencv.hpp>
using namespace cv;
#include<string>
using namespace std;
using namespace cv;class VIDEO
{
public:VIDEO();
public://参数1滚动条变量 参数2窗口的变量 参数3 窗口名字void VideoShow(CScrollBar &gdt, CRect &rect, String name,String picpath);//打开文件展示函数void SCroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);//滑动窗口函数void ZanTing();//暂停播放函数void KuaiJin(CScrollBar &gdt);//快进 参数:滚动条变量void KuaiTui(CScrollBar &gdt);//快退 参数:滚动条变量virtual ~VIDEO();
};#endif

三:新建类的cpp源文件中

#include "stdafx.h"
#include "VIDEO.h"
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
VIDEO::VIDEO()
{}VIDEO::~VIDEO()
{
}double zhen;
double nowzhen = 0;
bool z = FALSE;
//打开视频展示
void VIDEO::VideoShow(CScrollBar &gdt, CRect &rect, String name,String picpath)
{Mat frame;//ShiPin = imread(picpath);Mat dst;VideoCapture capture(picpath);//读入视频zhen = capture.get(CV_CAP_PROP_FRAME_COUNT);gdt.SetScrollRange(1, zhen);//设置滚动条的初始值范围while (1){if (nowzhen == zhen | nowzhen >= zhen)//循环播放{gdt.SetScrollPos(0);//初始化nowzhen = 0;z = FALSE;//默认暂停}char string[10];double t, fps;//设置帧率模块t = (double)getTickCount();capture.set(CV_CAP_PROP_POS_FRAMES, nowzhen);//滚动条改变后设置新帧率capture >> frame;//读取当前帧t = ((double)getTickCount() - t) / getTickFrequency();fps = 1.0 / t;sprintf_s(string, "%.2f", fps);String fpsString("FPS:");//若视频播放完成,退出循环if (z)//判断是否暂停{nowzhen++; //自增帧gdt.SetScrollPos(++nowzhen);//滑动条跟踪fpsString += string;//帧率运动}resize(frame, dst, Size(rect.Width(), rect.Height()));putText(dst, fpsString, Point(20, 20), FONT_HERSHEY_PLAIN, 1, (255, 0, 0));imshow(name, dst);waitKey(30);//延时30ms}}//滚动条
void VIDEO::SCroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{int TempPos = pScrollBar->GetScrollPos();switch (nSBCode){case SB_THUMBPOSITION://拖动滑块pScrollBar->SetScrollPos(nPos);nowzhen = nPos;break;case SB_LINELEFT://点击左边的箭头if (TempPos > 1){TempPos--;}pScrollBar->SetScrollPos(TempPos);nowzhen = TempPos;break;case SB_PAGEUP://点击滚动条左方空白if (TempPos > 1){pScrollBar->SetScrollPos(TempPos - zhen / 5, TRUE);}nowzhen = TempPos - zhen / 5;break;case SB_PAGEDOWN://点击滚动条右方空白if (TempPos < zhen){pScrollBar->SetScrollPos(TempPos + zhen / 5, TRUE);}nowzhen = TempPos + zhen / 5;break;case SB_LINERIGHT://点击右边的箭头if (TempPos < zhen){TempPos++;}pScrollBar->SetScrollPos(TempPos);nowzhen = TempPos;break;}// TODO: 在此添加消息处理程序代码和/或调用默认值
}//暂停
void VIDEO::ZanTing()
{if (z){z = FALSE;}else{z = TRUE;}
}//快进
void  VIDEO::KuaiJin(CScrollBar &gdt)
{if (nowzhen + zhen / 5 >= zhen){nowzhen = 0;gdt.SetScrollPos(nowzhen);}else{nowzhen += zhen / 5;//快进gdt.SetScrollPos(nowzhen);}
}//快退
void  VIDEO::KuaiTui(CScrollBar &gdt)
{if (nowzhen <= zhen / 5)//防止溢出{nowzhen = 0;gdt.SetScrollPos(nowzhen);}else{nowzhen -= zhen / 5;//快退gdt.SetScrollPos(nowzhen);}
}

调用类实现功能

导入新建类头文件
添加全局变量

VIDEO video;//创建新建类对象
CRect rect;
String picpath;

初始化oninit方法下 添加句柄:

// TODO:  在此添加额外的初始化namedWindow("view", WINDOW_AUTOSIZE);HWND hWnd = (HWND)cvGetWindowHandle("view");HWND hParent = ::GetParent(hWnd);::SetParent(hWnd, GetDlgItem(IDC_pic)->m_hWnd);::ShowWindow(hParent, SW_HIDE);

按钮方法下 添加:

CString piPath;//定义图片路径变量  CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, NULL);  //选择文件对话框  if (dlg.DoModal() == IDOK){piPath = dlg.GetPathName();  //获取图片路径  }picpath = piPath.GetBuffer(0);GetDlgItem(IDC_pic)->GetClientRect(&rect);Rect dst(rect.left, rect.top, rect.right, rect.bottom);//CString to string  使用这个方法记得字符集选用“使用多字节字符”,不然会报错 video.VideoShow(cs_bat, rect, "view", picpath);

VideoCapture,mfc读取视频并使用滚动条相关推荐

  1. Linux Ubuntu cv2.VideoCapture无法读取视频文件mp4

    版本: opencv-contrib-python  (4.1.2.30) numpy  (1.16.4) opencv-python  (4.1.2.30) 代码: video_file = '~/ ...

  2. VideoCapture 读取视频文件,显示视频(帧)信息

    #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <ope ...

  3. OpenCv3 VideoCapture读取视频失败解决方法

    用vs2017+win10+opencv420编译的程序无法在win7打开文件,换一个opencv版本就好了 将opencv2换成opencv3以后,遇到了各种各样的问题,以后再慢慢记录. 其一,Vi ...

  4. videocapture 保存图片_RoboMaster视觉教程OpenCV(二)读取视频图像与转换

    RoboMaster视觉教程OpenCV(二)读取视频图像与转换 在Robomaster比赛中,读取视频或者图像是极其重要的.因为我们需要在热身赛的时候用摄像头保存一段视频或者图片.之后根据视频中的光 ...

  5. opencv videocapture读取视频cap.isOpened 输出总是false

    利用qt+opencv3+c++ 读取视频文件,发现isOpened()总是输出false 一直以为是语句的问题,后来反应过来可能是打开视频格式,或者视频本身能否播放. 检查发现,是视频本身不能播放, ...

  6. OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测

    我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头. VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从 ...

  7. 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题

    解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1. 问题 2. 解决 3. 源代码 参考 1. 问题 读取H264视频,抽帧视频并保存,报错如下: [ ...

  8. Ubuntu下使用Anaconda安装opencv 解决无法读取视频

    Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...

  9. python使用方法视频-Python读取视频的两种方法(imageio和cv2)

    用python读取视频有两种主要方法,大家可依据自己的需求进行使用. 方法一: 使用imageio库,没有安装的可用pip安装或自己下载,安装好后重启终端即可调用. import pylab impo ...

最新文章

  1. pyqt5中QWidget的show 一闪而过的原因及解决办法实例
  2. python邮件添加附件_如何向电子邮件python添加多个附件
  3. MT-Retina.js
  4. 400位京东技术专家心血之作 《决战618:探秘京东技术取胜之道》重磅发售!
  5. HashMap之扰动函数和低位掩码
  6. 服务端设置忽略更新_react服务端渲染: cookie如何透传给后端,后端如何设置cookie...
  7. mysql fixed数据类型_fixed数据类型
  8. B/S----验证方式及练习
  9. TensorFlow 2.0官方风格与设计模式指南
  10. 海康VisionMaster的使用
  11. 光敏二极管的工作原理
  12. VTK实现多个体数据映射到一起进行渲染
  13. Halcon 3D create_pose
  14. Gprs通信协议服务器,GPRS协议简介
  15. python设计一个三维向量类_一个简单的三维向量类
  16. 运维之DNS服务器Bind9配置解析和基础示例及附带命令
  17. B. Catching Cheaters(cf)dp
  18. 《编译原理-龙书》练习第4章
  19. CHAP MS-CHAPv2 EAP
  20. 2017企业网盘年终盘点|机遇与挑战并存,寡头显现

热门文章

  1. STM32 CubeIDE 断点失效的解决方法
  2. JAVA匹配所有英文_java匹配汉字、英文、数字
  3. 电信物联网平台插件开发相关总结
  4. IIS发布问题:HTTP错误404.17和404.2
  5. 欧洲游记之—— 路过荷兰
  6. html网页随机一言,PHP简单实现一言 / 随机语录功能
  7. Java中对象属性的初始化顺序
  8. 计算机组装方案i5,3000元预算方案i5 8400/GTX1050Ti装配配置清单推荐
  9. 逆波兰式 java_Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析...
  10. web前端新手入门:中国互联网的发展史