C++封装Halcon算法动态链接库Dll补充

news2024/11/19 9:22:48

前面写了一篇关于C++封装DLL的文章,这里是做一个补充。
一、关于如何配置halcon和opencv库不再多说,前面文章介绍的很详细。下面介绍封装新增的东西。
1.1 首先创建类function1,并编写function.h和function1.cpp代码。
在这里插入图片描述

function1.h代码

#pragma once
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <thread>
#include <vector>
#include <algorithm>
#include <Halcon.h>
#include <HalconCpp.h>

using namespace std;
using namespace HalconCpp;


enum ErrorType
{
	Intrusion = 0,//缺口
	Protrusion,//突起
	CornerMiss//缺角

};
struct mStruct
{
	//输入参数
	int id;
	HObject Img;
	int threshold_Min;
	int threshold_Max;
	//输出参数
	double &Area;
};
class function1
{
public:
	function1();
	~function1();
public:
	int add(int a, int b);
	int subtract(int a, int b);
	//Halcon算法测试
	int TransferHobj_Test(mStruct &Struct1);

};

function1.cpp代码

#include "pch.h"
#include "function1.h"
function1::function1(){}
function1::~function1(){}
int function1::add(int a,int b)
{
	return a + b;
}
int function1::subtract(int a, int b)
{
	return a - b;
}
//传递Hobject图像测试函数
int function1::TransferHobj_Test(mStruct &Struct1)
{
	try
	{
		HObject  ho_Regions, ho_ConnectedRegions;
		HObject  ho_SelectedRegions;
		HTuple  hv_Number, hv_Area, hv_Row, hv_Column;
		Threshold(Struct1.Img, &ho_Regions, Struct1.threshold_Min, Struct1.threshold_Max);
		Connection(ho_Regions, &ho_ConnectedRegions);
		SelectShape(ho_ConnectedRegions, &ho_SelectedRegions, "area", "and", 1.19836e+007,
			2e+007);
		CountObj(ho_SelectedRegions, &hv_Number);
		if (0 != (hv_Number == 1))
		{
			AreaCenter(ho_SelectedRegions, &hv_Area, &hv_Row, &hv_Column);
			Struct1.Area = hv_Area.D();
		}
		else
		{
			Struct1.Area = 0;
		}
		return 0;
	}
	catch (...)
	{
		return 1;
	}
}

1.2 分别创建DllEntry.h和DllEntry.cpp作为上位机调用接口类,打开项目属性,找到C/C++预处理器,进入预处理器定义。在最下面加上MYDLL。然后编辑DllEntry.h和DllEntry.cpp代码。在头文件中加上下面的代码,然后再写别的代码

#ifdef MYDLL // 用来导出函数
#define DLLVLC_API __declspec(dllexport)
#else // 用来标识为导入函数,对于引用该头文件的外部模块来说dllimport这个标记对编译优化有作用
#define DLLVLC_API __declspec(dllimport)
#endif

在这里插入图片描述

DllEntry.h代码

#pragma once
#ifdef MYDLL // 用来导出函数
#define DLLVLC_API __declspec(dllexport)
#else // 用来标识为导入函数,对于引用该头文件的外部模块来说dllimport这个标记对编译优化有作用
#define DLLVLC_API __declspec(dllimport)
#endif

#include <iostream>
#include <vector>
#include <stdio.h>
#include "string"
#include "function1.h"
#include <Halcon.h>
#include <HalconCpp.h>

using namespace HalconCpp;

namespace TestVLCDLL 
{
	extern "C" 
	{
		DLLVLC_API int myAddFunction_interface(int a, int b);
		DLLVLC_API int mySubtractFunction_interface(int a, int b);
		DLLVLC_API int TransferHobj_Test_interface(mStruct Struct1);
	}
}

DllEntry.cpp代码

#include "pch.h"
#include "DllEntry.h"
#include <fstream>
#include <thread>
#include <mutex>
using namespace std;
//声明一个线程锁,用于做线程同步
std::mutex mutexx1, mutexx2;
DLLVLC_API int TestVLCDLL::myAddFunction_interface(int a, int b)
{
	mutexx1.lock();
	function1 f;
	return f.add(a, b);
	mutexx1.unlock();
}
DLLVLC_API int TestVLCDLL::mySubtractFunction_interface(int a, int b)
{
	mutexx2.lock();
	function1 f;
	return f.subtract(a, b);
	mutexx2.unlock();
}
DLLVLC_API int TestVLCDLL::TransferHobj_Test_interface(mStruct Struct1)
{
	function1 f;
	return f.TransferHobj_Test(Struct1);
}

这段代码的含义是,MYDLL是在我自己的项目属性里面提前定义了,所以项目编译的时候会编译DLLVLC_API __declspec(dllexport),而上位机调用的时候没有提前定义MYDLL,上位机代码编译的时候就会编译DLLVLC_API __declspec(dllimport)。说是dllimport这个标记对编译优化有作用。不过经过我的项目实测,其实不写头文件中那一段代码,直接按照下面的代码写,也是正常编译运行的
extern “C” _declspec (dllexport) int TransferHobj_Test_interface(mStruct Struct1);
二、新建C++控制台程序TestDll,测试封装的dll。
2.1 创建项目解决方案
在这里插入图片描述
2.2 把封装好的东西全部放入TestDll的执行目录下,包含以下文件 Dll1.dll,Dll1.lib,DllEntry.h,function1.h。
然后配置C/C++常规附加包含目录,链接器常规附加库目录,链接器输入附加依赖项。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main()调用dll代码

int main()
{
	//引用Dll封装库的命名空间
	using namespace TestVLCDLL;
	int ret = TestVLCDLL::myAddFunction_interface(1,2);
	ret = mySubtractFunction_interface(10,5);

	//测试C++封装的函数
	int a = 0;

	HObject img;
	ReadImage(&img,"F:\\SanYuan_Image\\DaTu20221102-1\\1\\0.bmp");
	double Area = 1;
	mStruct struct1 =
	{
		//输入参数
		10,
		img,
		65,
		100,
		//输出参数
		Area
	};
	a = TestVLCDLL::TransferHobj_Test_interface(struct1);
}

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

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

相关文章

处理任务失败附实验(RH294)

首先&#xff0c;一个任务执行失败是肯定会遇见的事情而这时候&#xff0c;就需要一个备用的计划忽略任务失败默认情况下 任务失败的时候play会终止但是&#xff0c;我们可以通过忽略失败的任务来覆盖此行文使用关键字 ignore_errors举个栗子- name: Latest version of notapkg…

《流浪地球 2》 Deepfake 小试牛刀,45+ 吴京「被」年轻,变身 21 岁小鲜肉

内容一览&#xff1a;在春节档科幻电影「流浪地球 2」中&#xff0c;主演吴京、刘德华、沙溢等人饰演的角色&#xff0c;跨越 14 年之久&#xff0c;视效团队正是借助 Deepfake de-aging 技术&#xff0c;呈现出了演员不同年龄段的容貌。 关键词&#xff1a;De-aging Deepfa…

回收租赁商城系统功能拆解13讲-分销会员

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

springboot应用项目的打包和部署

jar包方式打包部署 springboot项目在为进行打包处理时就已经可以进行运行调试&#xff0c;是因为springboot项目内嵌了Tomcat服务器. .1添加Maven打包插件。在对Spring Boot项目进行打包(包括ar包和War包)前&#xff0c;需要在项目pom.xml文件中加入Maven打包插件&#xff0c…

倾角传感器的六大应用场合

倾角传感器又名水平传感器、水平仪、倾角仪&#xff0c;是角度传感器的一种&#xff0c;是运用惯性原理的一种加速度传感器&#xff0c;可以通过检测使用环境中的倾斜角度判断设备的倾斜状态&#xff0c;并在监测物出现角度偏差时&#xff0c;倾角传感器能够将异常数据传达给管…

【自学Docker 】Docker export命令

Docker export命令 概述 docker export教程 docker export 命令可以用于将 Docker容器 里的文件系统作为一个 tar 归档文件导出到标准输出。docker export 命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker save 命令用于将 Docker 镜像保存成 tar 包&a…

5nm三苯甲基/P3HT-PY/CdSe油溶性碳量子点CdSe/ZnS-PrPC的制备方法

5nm三苯甲基/P3HT-PY/CdSe油溶性碳量子点CdSe/ZnS-PrPC的制备方法今天小编分享制备三苯甲基功能化油溶性碳量子点的制备过程&#xff0c;一起看看吧&#xff1a;三苯甲基功能化油溶性碳量子点的制备过程&#xff1a;将50 mg Amino-CQDs放置在100 mL圆底烧瓶中,加入 50 mL二氯甲…

PyQt6-QLabel学习笔记

QLabel支持文本或图片显示&#xff0c;是任何GUI设计中最常用的控件之一。一、QLabel基本概述QLabel标签用于显示&#xff0c;可以以多种方式进行外观配置&#xff0c;没有提供用户交互功能&#xff0c;但是可以用于为另一个小部件指定焦点助记符或快捷键。显示内容类型类型说明…

HoloLens 2 应用开发流程笔记

本文链接&#xff1a;微信推文阅读效果更佳 目录安装工具应用开发举例配置 Unity创建新的 Unity 项目切换生成平台导入和配置资源导入 MRTK Unity 基础包配置 Unity 项目为 XR SDK 配置项目设置创建场景并配置 MRTK交互例子添加并调整第一个立方体向立方体添加脚本添加第二个立…

20篇高质量程序人生文章分享,做开发不仅仅只有代码

我一直觉得&#xff0c;我们做开发&#xff0c;不应该只有代码&#xff0c;合上公司的电脑脱离了公司的产品需求就脱离了程序&#xff0c;而应该结合软件的程序思维去更多的思考我们所处的生活和空间&#xff0c;从而指导自己面对更多的未曾见过的人与事&#xff0c;这可能就是…

Java基础之异常处理

一、小试牛刀 num1 / num2 当除数为零时&#xff0c;程序就会抛出异常&#xff0c;程序就会崩溃而导致退出。 我们可以通过异常处理机制来解决该问题 如果我们认为一段代码可能发生异常&#xff0c;可以使用try-catch-finally异常处理机制来解决。从而保证程序的健壮性。 将可能…

前端工程化-多维度检测重复代码

更多文章可关注我的个人博客&#xff1a;https://seven777777.github.io/myblog/ 1. 检测项目重复代码 1.1 检测方案&#xff1a;jscpd 方法一&#xff1a; 全局安装jscpd依赖npm i -g jscpd项目根路径执行&#xff1a;jscpd -p "src/**/*.js" -k 15 -l 5 方法二…

【黑马SpringCloud(3)】Docker

Docker初识DockerDocker与虚拟机的区别Docker架构DockerHubDocker镜像操作Docker容器操作数据卷自定义镜像镜像结构Dockerfile构建Java项目基于java:8-alpine镜像&#xff0c;构建java项目集群部署微服务Docker-Compose镜像仓库搭建私有镜像仓库Docker安装&#xff1a;https://…

Go第 14 章 :文件操作

Go第 14 章 &#xff1a;文件操作 14.1 文件的基本介绍  文件的概念 文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的 word文档,txt文 件,excel 文件…都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声 音… …

排序分页多表查询

文章目录一、排序ORDER BY排序规则单列排序多列排序二、分页LIMIT背景实现格式举例公式优点三、多表查询笛卡尔积&#xff08;或交叉连接&#xff09;的理解解决笛卡尔积问题多表查询分类等值连接非等值连接自连接内连接 vs 外连接SQL99实现多表查询基本语法内连接&#xff08;…

测试人员怎么对待Bug

测试人员如何描述发现的Bug咱们提Bug至少要包含这个问题出现的版本&#xff0c;问题出现的环境&#xff0c;问题出现的步骤&#xff0c;预期结果&#xff0c;实际结果。但不限于标题&#xff0c;bug归属&#xff0c;bug等价等等举个栗子&#x1f601;很容易发现二维码被登入页面…

深入分析三层网络交换机的原理和设计

引言 传统路由器在网络中起到隔离网络、隔离广播、路由转发以及防火墙的作业&#xff0c;并且随着网络的不断发展&#xff0c;路由器的负荷也在迅速增长。其中一个重要原因是出于安全和管理方便等方面的考虑&#xff0c;VLAN(虚拟局域网)技术在网络中大量应用。VLAN技术可以逻辑…

跨平台编译go(交叉编译)

以将一个简单的go http 部署到docker为例&#xff01; 方法一&#xff1a;构建service镜像同时拉取go镜像 Dockerfile文件 # alpine Linux发行版&#xff0c;该发行版的大小很小并且内置了Go FROM golang:alpine# 设置linux环境变量 ENV GO111MODULEon \CGO_ENABLED0 \GOOSl…

MyBatis持久层框架详细解读:MyBatis快速入门篇

文章目录1. 前言2. JDBC 存在的缺点3. MyBatis 优化4. MyBatis 快速入门5. 总结Java编程基础教程系列1. 前言 JavaEE 企业级 Java 项目中的经典三层架构为表现层&#xff0c;业务层和持久层&#xff0c;使用Java 代码操作数据库属于持久层内容&#xff0c;而 MyBatis 对 JDBC …

Appmsg:APP辅助分析神器

一、前言 在进行APP渗透测试、APP病毒分析或写APP测试报告时经常会用到APP基本信息&#xff0c;有些工具虽然可以解析APP&#xff0c;但缺少想要的信息&#xff0c;有些解析的结果不够准确&#xff0c;于是只好自研一款工具来解决。 二、定位 主要适用于以APP病毒分析、APP漏…