利用opencv编写dll,在另一个MFC程序中调用显示视频,dll可以用于没有装opencv的电脑中

参考文章:
创建和使用动态链接库(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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值