用VC2019+MFC 创建一个DLL封装MD工业相机库然后用EXE调用这个相机库采图并且显示

news2024/11/29 22:14:50

主要描述:

用VC2019+MFC 创建一个DLL封装MD工业相机库,再建一个EXE调用这个相机库采图并且显示。

先创建库工程:
新建一个库工程,

创建完成,添加一个DllFunction.h头文件,一个DllFunction.cpp 源文件

拷贝相关SDK文件到对应的目录下

(略,自行拷贝到相应位置,路径加进工程)

源码如下

DllFunction.h

#pragma once

extern "C" __declspec(dllexport) int InitCamera(int indexCam = 0);
extern "C" __declspec(dllexport) int GetImage();
extern "C" __declspec(dllexport) int Reconnect();
extern "C" __declspec(dllexport) int UninitCamera();

DllFunction.cpp

#pragma once

#include <Windows.h>
//引用相机的SDK包,lib文件的路径根据您的开发环境修改。
#include "CameraApi.h"	 
#include "CameraGrabber.h"
#ifdef _WIN64
#pragma comment(lib, "..\\MVCAMSDK_X64.lib")
#else
#pragma comment(lib, "..\\MVCAMSDK.lib")
#endif

tSdkCameraCapbility m_sCameraInfo; //相机特性描述
UINT            m_threadID;//图像抓取线程的ID
HANDLE          m_hDispThread;//图像抓取线程的句柄
BOOL            m_bExit;//用来通知图像抓取线程结束
BOOL            m_bTrigger;
double			m_fExpTime;//当前的帧曝光时间,单位为us
double			m_fExpLineTime;//当前的行曝光时间,单位为us
INT 			m_iAnalogGain;//当前的信号模拟增益值,步进值为m_fAnalogGainStep

BYTE* m_pFrameBuffer;//用于将原始图像数据转换为RGB的缓冲区(采集线程中)
BYTE* pOutBuffer;
BOOL	        m_bPause;//是否暂停图像
CameraHandle    m_hCamera;	//相机的设备句柄|the handle of the camera we use
tSdkFrameHead   m_sFrInfo;//用于保存当前图像帧的帧头信息


//功能:初始化相机,进行相机的初始化操作
extern "C" __declspec(dllexport) int InitCamera(int indexCam = 0)
{
	if (m_hCamera != 0)
	{
		if (NULL != m_hDispThread)
		{
			m_bExit = TRUE;
			::WaitForSingleObject(m_hDispThread, INFINITE);
			CloseHandle(m_hDispThread);
			m_hDispThread = NULL;
		}
		CameraStop(m_hCamera);
		CameraUnInit(m_hCamera);
	}
	CameraSetCallbackFunction(m_hCamera, NULL, (PVOID)0, NULL);

	tSdkCameraDevInfo sCameraList[10];
	INT iCameraNums;
	CameraSdkStatus status;
	CameraSdkInit(1);

	void* m_Grabber;
	tSdkCameraDevInfo m_DevInfo;
	status = CameraGrabber_CreateFromDevicePage(&m_Grabber);
	if (status != CAMERA_STATUS_SUCCESS)
	{
		return -1;
	}

	CameraGrabber_GetCameraDevInfo(m_Grabber, &m_DevInfo);
	CameraGrabber_GetCameraHandle(m_Grabber, &m_hCamera);

	CameraGetCapability(m_hCamera, &m_sCameraInfo);
	m_pFrameBuffer = CameraAlignMalloc(m_sCameraInfo.sResolutionRange.iWidthMax * 200000, 16); //20万行线扫

	BOOL m_bMonoSensor = m_sCameraInfo.sIspCapacity.bMonoSensor;
	
	if (m_sCameraInfo.sIspCapacity.bMonoSensor)
	{
		CameraSetIspOutFormat(m_hCamera, CAMERA_MEDIA_TYPE_MONO8);
	}

	CameraSetTriggerMode(m_hCamera, 1);

	CameraPlay(m_hCamera);

	return 0;
}

extern "C" __declspec(dllexport) int GetImage()
{
	tSdkFrameHead 	sFrameInfo;
	BYTE* pbyBuffer;
	CameraSdkStatus status;
	CameraSoftTrigger(m_hCamera);
	status = CameraGetImageBuffer(m_hCamera, &sFrameInfo, &pbyBuffer, 10000);
	if (status == CAMERA_STATUS_SUCCESS)
	{
		status = CameraImageProcess(m_hCamera, pbyBuffer, m_pFrameBuffer, &sFrameInfo); 
		status = CameraSaveImage(m_hCamera, (char*)"H:\\test.bmp", m_pFrameBuffer, &sFrameInfo, FILE_BMP, 100);  //no -22

		CameraReleaseImageBuffer(m_hCamera, pbyBuffer);
	}
	return status;
}

extern "C" __declspec(dllexport) int Reconnect()
{
	CameraSdkStatus status = CameraReConnect(m_hCamera);
	return status;
}

extern "C" __declspec(dllexport) int UninitCamera()
{
	CameraSdkStatus status = CameraUnInit(m_hCamera);
	CameraAlignFree(m_pFrameBuffer);
	return status;
}



再创建一个exe程序,用来调用创建的dll文件 。

创建,下一步选择基于对话框的项目,下一步后的打印相关的、COM相关的全部不用选择,其他的默认就可以。
拖拉一些控件到对话框窗口上,最终如下图

文件源码如下

MindVisionCallDlg.h: 头文件


#pragma once


// CMindVisionCallDlg 对话框
class CMindVisionCallDlg : public CDialogEx
{
// 构造
public:
	CMindVisionCallDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MINDVISIONCALL_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedBtnInit();
	afx_msg void OnBnClickedBtnReconn();
	afx_msg void OnBnClickedBtnGrab();
	afx_msg void OnClose();
	CStatic m_cPreview;
};

MindVisionCallDlg.cpp: 实现文件


#include "pch.h"
#include "framework.h"
#include "MindVisionCall.h"
#include "MindVisionCallDlg.h"
#include "afxdialogex.h"

#include "DllFunction.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CMindVisionCallDlg::CMindVisionCallDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MINDVISIONCALL_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMindVisionCallDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_STATIC_PREVIEW, m_cPreview);
}

BEGIN_MESSAGE_MAP(CMindVisionCallDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_INIT, &CMindVisionCallDlg::OnBnClickedBtnInit)
	ON_BN_CLICKED(IDC_BTN_RECONN, &CMindVisionCallDlg::OnBnClickedBtnReconn)
	ON_BN_CLICKED(IDC_BTN_GRAB, &CMindVisionCallDlg::OnBnClickedBtnGrab)
	ON_WM_CLOSE()
END_MESSAGE_MAP()

BOOL CMindVisionCallDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMindVisionCallDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this);
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

HCURSOR CMindVisionCallDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CMindVisionCallDlg::OnBnClickedBtnInit()
{
	int code = InitCamera(1);
	if (code)
	{

	}
	CString Info;
	Info.Format(_T("Result = %d"), code);
	SetDlgItemText(IDC_STC_INFO, Info);
}

void CMindVisionCallDlg::OnBnClickedBtnReconn()
{
	int code = Reconnect();
	if (code)
	{

	}
	CString Info;
	Info.Format(_T("Result = %d"), code);
	SetDlgItemText(IDC_STC_INFO, Info);
}

void CMindVisionCallDlg::OnBnClickedBtnGrab()
{
	int code = GetImage();
	if (0 == code)
	{
	
		CClientDC dc(this);
		CDC* mdc = new CDC;
		mdc->CreateCompatibleDC(&dc);
		CBitmap bitmap;
		bitmap.m_hObject = (HBITMAP)::LoadImageA(AfxGetInstanceHandle(), (char*)"H:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

		mdc->SelectObject(bitmap);
		CRect rect;
		::GetWindowRect(m_cPreview.GetSafeHwnd(), &rect);
		ScreenToClient(&rect);

		BITMAP sBitMap;
		bitmap.GetBitmap(&sBitMap);
		dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), mdc, 0, 0, sBitMap.bmWidth, sBitMap.bmHeight, SRCCOPY);

		delete mdc;
	}
	CString Info;
	Info.Format(_T("Result = %d"), code);
	SetDlgItemText(IDC_STC_INFO, Info);
}


void CMindVisionCallDlg::OnClose()
{
	int code = UninitCamera();
	if (code)
	{

	}
	CDialogEx::OnClose();
}

两个工程保存在同一个方案,然后建立项目依赖,如此就两个工程一起编译。

最后运行效果,

(本节结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ODB 框架

目录 概述 基本工作原理 映射C对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id auto column&#xff08;“xxx”&#xff09; type("xxx") unique index null default&…

ModuleNotFoundError: No module named ‘_ssl‘ centos中的Python报错

1、检查系统有没有openssl&#xff0c;有的话&#xff0c;就是python安装时没有指定openssl openssl version&#xff0c;有输出版本号就有&#xff0c;没有的话&#xff0c;需要手动安装 下载地址 参见https://www.openssl.org/&#xff0c;包括以下版本&#xff1a; https:/…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

linux高级系统编程之进程

进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…

GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?

在技术快速发展的今天&#xff0c;代码辅助工具已成为提升开发效率的利器。今天&#xff0c;我们带来了一个激动人心的消息——GitHub Copilot宣布引入多模型选择功能&#xff0c;这不仅是技术上的一次飞跃&#xff0c;更是对开发者工作流程的一次革新。 多模型选择&#xff1a…

AppFlow:支持飞书机器人调用百炼应用

AppFlow&#xff1a;支持飞书机器人调用百炼应用 简介&#xff1a; 本文介绍了如何创建并配置飞书应用及机器人&#xff0c;包括登录飞书开发者后台创建应用、添加应用能力和API权限&#xff0c;以及通过AppFlow连接流集成阿里云百炼服务&#xff0c;最后详细说明了如何将机器…

华为E9000刀箱(HWE9000V2)服务器硬件监控指标解读

随着数据中心规模的不断扩大&#xff0c;服务器的稳定性和可靠性变得尤为重要。华为E9000刀箱&#xff08;HWE9000V2&#xff09;作为一款高性能的服务器设备&#xff0c;其硬件状态的实时监控对于保障业务的连续性和系统的稳定运行至关重要。 监控易作为一款专业的IT基础设施监…

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解 目录 GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GWO-SVMD灰狼算法优化逐次变分模态分解 内有15种用以优化svmd的适应度函数&#…

景联文科技:高质量数据采集标注服务引领AI革新

在当今这个数字化时代&#xff0c;数据已经成为推动社会进步和产业升级的关键资源。特别是在人工智能领域&#xff0c;高质量的数据是训练出高效、精准的AI模型的基础。景联文科技是一家专业的数据采集与标注公司&#xff0c;致力于为客户提供高质量的数据处理服务&#xff0c;…

pycharm添加gitee插件

一、拉取gitee上托管的代码到本地&#xff0c;用pycharm运行 前置条件 1.安装python运行环境 2.安装pycharm 安装&#xff1a;https://blog.csdn.net/m0_65482549/article/details/141394352 1.3.安装git git config --global user.name “" git config --global user.em…

Echarts 绘制地图

一、Apache Echarts 官网地址&#xff1a;https://echarts.apache.org/ npm install echarts --save 二、获取地图的GeoJSON 地址&#xff1a;DataV.GeoAtlas地理小工具系列 左侧是地图&#xff0c;右侧是JSON数据路径&#xff0c;点击你想要生成的地图省市、地级&#xff0…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

html+css+js网页设计 旅游 厦门旅游网14个页面

htmlcssjs网页设计 旅游 厦门旅游网14个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&am…

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…

现代化水库可视化管理平台:提升水库运行效率与安全保障

随着科技的飞速发展&#xff0c;现代化水利管理逐渐依赖于数字化、智能化手段。作为水利基础设施的重要组成部分&#xff0c;水库的管理不仅关乎水资源的合理利用&#xff0c;还关系到防洪、灌溉、供水等多项社会功能的实现。为了提升水库的管理水平&#xff0c;确保其运行安全…

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

【论文笔记】Number it: Temporal Grounding Videos like Flipping Manga

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Number it: Temporal Grou…

软件/游戏提示:mfc42u.dll没有被指定在windows上运行如何解决?多种有效解决方法汇总分享

遇到“mfc42u.dll 没有被指定在 Windows 上运行”的错误提示&#xff0c;通常是因为系统缺少必要的运行库文件或文件损坏。以下是多种有效的解决方法&#xff0c;可以帮助你解决这个问题&#xff1a; 原因分析 出现这个错误的原因是Windows无法找到或加载MFC42u.dll文件。这可…

网络地址转换

NAT概述 解决公有地址不足&#xff0c;并且分配不均匀的问题 公有地址&#xff1a;由专门的机构管理、分配&#xff0c;可以在因特网上直接通信 私有地址&#xff1a;组织和个人可以任意使用&#xff0c;只能在内网使用的IP地址 A、B、C类地址中各预留了一些私有IP地址 A&…

机器学习-神经网络(BP神经网络前向和反向传播推导)

1.1 神经元模型 神经网络(neural networks)方面的研究很早就已出现,今天“神经网络”已是一个相当大的、多学科交叉的学科领域.各相关学科对神经网络的定义多种多样,本书采用目前使用得最广泛的一种,即“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够…