利用opencv编写dll,在另一个MFC程序中调用显示视频,dll可以用于没有装opencv的电脑中
2017-12-30 20:23
609 查看
参考文章:
创建和使用动态链接库(C++): https://msdn.microsoft.com/zh-cn/library/ms235636(v=vs.120).aspx
dll生成与使用: http://blog.csdn.net/elaine_bao/article/details/51784864
C++编译提示error LNK2005/1169 找到一个或多个重定义的符号: http://ask.csdn.net/questions/353139
1. 新建程序,命名
选择dll,导出符号
2. 本人要使用opencv函数调用相机,并在MFC中显示视频,在.h头文件中添加命名空间和类,dll编写完毕,生成解决方案
3. 新建MFC程序,命名,选择对话框
选择基于对话框,点击完成
4. 添加Picture Control空间,ID为IDC_STATIC,添加按钮,ID为IDC_Start
启动调试
5.将cameradll的debug中的dll和lib拷到Videoshow的debug中
将camera.h复制到VideoShow的工程目录下(包含.cpp的文件内)
6. 配置VIdeoShow项目属性
7. 在头文件中添加代码,加载库文件,并声明类,定义Mat对象
在对话框初始化添加代码,通过设定父窗口将OpenCV创建的Window与PicControl控件绑定
8. 添加定时器
对话框界面右击,选择类向导,选择消息,WM_TIMER,添加处理程序
定时器添加代码
9. 添加打开视频按钮点击程序
10.运行程序
如果直接把程序在没有opencv或者没有装vs的电脑中运行,会缺少dll库文件,这时需要把相应缺少的拷贝进exe程序所在的文件夹即可
VS2010的MFC的一些库在这个文件下D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC100.DebugMFC
VS2010的一些动态链接库D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\ia64\Microsoft.VC100.DebugCRT
OPENCV的一些库文件D:\Program Files\opencv\build\x86\vc10\bin
创建和使用动态链接库(C++): https://msdn.microsoft.com/zh-cn/library/ms235636(v=vs.120).aspx
dll生成与使用: http://blog.csdn.net/elaine_bao/article/details/51784864
C++编译提示error LNK2005/1169 找到一个或多个重定义的符号: http://ask.csdn.net/questions/353139
1. 新建程序,命名
选择dll,导出符号
2. 本人要使用opencv函数调用相机,并在MFC中显示视频,在.h头文件中添加命名空间和类,dll编写完毕,生成解决方案
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 OPENCVDLL_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // OPENCVDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef OPENCVDLL_EXPORTS #define OPENCVDLL_API __declspec(dllexport) #else #define OPENCVDLL_API __declspec(dllimport) #endif #include<opencv2\imgproc\imgproc.hpp> #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> #include <iostream> #include <cstdio> using namespace cv; // 此类是从 opencvdll.dll 导出的 class OPENCVDLL_API Copencvdll { public: Copencvdll(void); // TODO: 在此添加您的方法。 }; extern OPENCVDLL_API int nopencvdll; OPENCVDLL_API int fnopencvdll(void); namespace camera //命名空间 { class OPENCVDLL_API mycamera { public: //添加一些自己功能函数 }; }
3. 新建MFC程序,命名,选择对话框
选择基于对话框,点击完成
4. 添加Picture Control空间,ID为IDC_STATIC,添加按钮,ID为IDC_Start
启动调试
5.将cameradll的debug中的dll和lib拷到Videoshow的debug中
将camera.h复制到VideoShow的工程目录下(包含.cpp的文件内)
6. 配置VIdeoShow项目属性
7. 在头文件中添加代码,加载库文件,并声明类,定义Mat对象
// VideoShowDlg.h : 头文件 // #pragma once #pragma comment(lib,"camerall.lib") #include "cameradll.h" // CVideoShowDlg 对话框 class CVideoShowDlg : public CDialogEx { // 构造 public: CVideoShowDlg(CWnd* pParent = NULL); // 标准构造函数
VideoCapture capture;
camera::mycamera cameras; //声明类Mat img,midImage;
在对话框初始化添加代码,通过设定父窗口将OpenCV创建的Window与PicControl控件绑定
// CVideoShowDlg 消息处理程序 BOOL CVideoShowDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 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); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 //通过设定父窗口将OpenCV创建的Window与PicControl控件绑定 namedWindow(windows_name,WINDOW_AUTOSIZE); //window_name.c_str();//string.c_str() HWND hWnd = (HWND) cvGetWindowHandle(windows_name.c_str()); //获得创建的窗口句柄 HWND hParent = ::GetParent(hWnd); //获得其父句柄 ::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd); //设置创建窗口的父窗口为Picture control控件 ::ShowWindow(hParent, SW_HIDE); //将父窗口及其子窗口进行隐藏 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
8. 添加定时器
对话框界面右击,选择类向导,选择消息,WM_TIMER,添加处理程序
定时器添加代码
void CVideoShowDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(1==nIDEvent) { if (camera::capture.isOpened()) { capture>>img; //以下操作获取图形控件尺寸并以此改变图片尺寸 CRect rect; GetDlgItem(IDC_STATIC)->GetClientRect(&rect);//获取Picture Control控件的大小 Rect dst(rect.left,rect.top,rect.right,rect.bottom); resize(img,midImage,cv::Size(rect.Width(),rect.Height())); imshow(windows_name,midImage); } } CDialogEx::OnTimer(nIDEvent); }
9. 添加打开视频按钮点击程序
void CVideoShowDlg::OnBnClickedStart() { // TODO: 在此添加控件通知处理程序代码 static int sw=0; if(sw==0) //打开摄像头 { GetDlgItem(IDC_Start)->SetWindowText("关闭相机"); capture.open(1); /* capture.set(CV_CAP_PROP_FRAME_WIDTH, width); //可以设置视频大小 capture.set(CV_CAP_PROP_FRAME_HEIGHT, height);*/ if (!capture.isOpened()) { AfxMessageBox("请打开相机"); } // rate=capture.get(CV_CAP_PROP_FPS); //获取视频本身的播放速度 // delay=1000*1.0/rate; //每一帧的延迟和帧率相对应 SetTimer(1,100,NULL); //定时器 } else //关闭摄像头 { GetDlgItem(IDC_Start)->SetWindowText("打开视频"); KillTimer(1); capture.release(); //关闭摄像头 } sw++; sw %=2; }
10.运行程序
如果直接把程序在没有opencv或者没有装vs的电脑中运行,会缺少dll库文件,这时需要把相应缺少的拷贝进exe程序所在的文件夹即可
VS2010的MFC的一些库在这个文件下D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC100.DebugMFC
VS2010的一些动态链接库D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\ia64\Microsoft.VC100.DebugCRT
OPENCV的一些库文件D:\Program Files\opencv\build\x86\vc10\bin
相关文章推荐
- opencv读取视频的程序,releae下静态编译,在没有安装opencv的电脑上需要一个解码dll
- 利用opencv类库在MFC显示摄像头视频并且保存摄像头视频
- 如何利用MFC编写的.exe调用C#编写的dll动态库
- DLL编写+MFC调用程序
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的
- 利用MFC和opencv读取视频显示图像方法
- 用JAVA语言编写程序:包含两个类,一个类Cricle中包含计算圆周长,面积的方法。在另一个类Compute中给出半径值为10,创建对象,并调用Cricle类中的方法,计算该对象的面积、周长并显示出结
- Qt主窗体显示最前 在delphi中使用Application.BringToFront;可以保证当前程序显示在最前。 然而今天在Qt中,没有类似函数供调用。 尝试了activeWindow,s
- MFC调用Opencv显示视频
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- 利用MFC和OpenCV构建GUI程序读取摄像头视频
- 求VC6.0中用MFC编写的SURF算法匹配程序,可以用到opencv
- 利用opencv类库在MFC显示摄像头视频并且保存摄像头视频
- 使用Opencv调用摄像头并在MFC中进行视频显示
- 创建一个程序读入和显示视频文件,并可以使用滑动条控制视频文件的播放。一个滑动条用来控制视频播放位置,以10为步长跳进。另一个滑动条用来控制停止/播放
- 用MFC编写的程序在别人电脑上显示时窗口界面出现问题
- OpenCV学习笔记 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面 .
- OpenCV学习 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- 一个大神的文章如何在没有OPENCV的电脑上跑你的程序调用的opencv程序