ids工业相机与电控位移台同步控制及数据采集

news2025/1/18 10:44:47

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集

  • 目录
    • 项目环境配置
    • 代码流程及思路
    • 项目架构
    • 项目开发运行效果
    • 开发关键
    • ids相机配置
    • 位移台环境配置
    • 相机头文件
    • 相机参数设置
    • 保存图像函数设置
    • 电控位移台头文件
    • 电控位移台设置参数
    • 最后就是通过main函数进行调用和控制,需要注意的是,最好能加上sleep函数,这样采集图像不容易出问题

目录

光学数据采集系统中,经常需要采集几万个样本点进行数据分析,如果通过人工数据采集,人工成本太高,同时容易出现测量误差等因素。因此需要根据项目功能开发一套自动化采集图像和位移控制的工程项目,以下是具体内容:

项目环境配置

代码环境:
VS2017
OpenCV3.4.2
ids开发包,包括.lib、.dll、.h文件等
LBtek电控五相位移平台,.dll、.h文件

代码流程及思路

  1. 相机初始化,根据图像尺寸申请内存地址;
  2. 导出图像内存指针,设置传感器参数
  3. 初始化位移台,新建类
  4. 通过dll查找位移台函数指针,调用函数
  5. 设置边界条件及步进电机参数
  6. 通过函数返回值与延时等机制,实现相机同步
  7. 批量化图像采集与数据处理

项目架构

在这里插入图片描述

项目开发运行效果

在这里插入图片描述

开发关键

相机和位移台属于商业产品,商家不提供完整程序包,只给出dll动态链接库,需要通过函数指针调用接口。
通过算法自定义位移台运行模式;
提升图像增益及伽马校正,自定义图像采集AOI,提升采集帧率;

ids相机配置

本文是基于debug x64模式下,C++ 环境运行,需要一老OpenCV的部分库函数,进行图像展示和保存。
OpenCV环境配置:具体配置方法CSDN其他博客都有记录,是通用的,
比如我之前配置旧版本的环境,大家可以参考: link

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
大家要注意,将这里的语言 符合模式 设置为否,原因是ids相机开发包里面存储文件的时候,使用的是wchat_t *的格式,调试过程中很容易出问题。如下图设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述相机环境配置完成。

位移台环境配置

由于开发包里面只提供了配置文件、.dll文件、.h文件,函数实现方法是不知道的,因此调用函数的时候是将这三个文件放置到项目代码包中,通过函数指针调用函数,配置说明书摸索函数功能。
这一部分环境配置就是将这几个文件放置到工程项目文件夹中即可。
在这里插入图片描述

相机头文件

#include "ueye.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

class Idscam {
   

public:
	Idscam();
	INT InitCamera(HIDS *hCam, HWND hWnd);   //初始化相机   hWnd指向显示图像窗口的指针,若用DIB模式可以令hWnd=NULL  
	bool OpenCamera();
	void ExitCamera();
	int  InitDisplayMode();
	void GetMaxImageSize(INT *pnSizeX, INT *pnSizeY);//查询相机支持的图像格式
	void SaveImage(wchar_t* fileName);
	bool GetiplImgFormMem(); //从视频数据流中将图像数据拷贝给IplImage
	// uEye varibles
	HIDS	m_hCam;				// 相机句柄
	HWND	m_hWndDisplay;		 // window显示句柄
	INT		m_nColorMode;		// Y8/RGB16/RGB24/REG32
	INT		m_nBitsPerPixel;	// 图像位深
	INT		m_nSizeX;		// 图像宽度
	INT		m_nSizeY;		// 图像高度
	INT		m_nPosX;		// 图像左偏移
	INT		m_nPosY;		// 图像右偏移
	cv::Mat CamMat;
	IplImage *iplImg;
	char *m_pLastBuffer;

private:

	// 使用位图模式进行实时显示需要的内存  
	INT	 m_lMemoryId;	        // camera memory - buffer ID
	char*	m_pcImageMemory;	// camera memory - pointer to buffer
	SENSORINFO m_sInfo;		// sensor information struct
	INT     m_nRenderMode;		// render  mode
	INT     m_nFlipHor;		// 水平翻转标志
	INT     m_nFlipVert;		// 垂直翻转标志

}; 

相机参数设置

int SetParasofCamera(HIDS hCam, uint nPixelClockSet, double nFramePerSecondSet, double nExposureTimeSet) {
   
	// 像素时钟查询与设置
	UINT nPixelClockDefault, nPixelClockCurrent;
	INT nRet;
	/*
	// 获取默认像素时钟
	nRet = is_PixelClock(hCam, IS_PIXELCLOCK_CMD_GET_DEFAULT, (void*)&nPixelClockDefault, sizeof(nPixelClockDefault));
	if (nRet == IS_SUCCESS) {
		cout << "Success, and default pixel clock is : " << nPixelClockDefault << " MHz." << endl;
	}
	else {
		cout << "Failed to get default pixel clock" << endl;
		return IS_NO_SUCCESS;
	}
	*/
	// 设置该像素时钟
	//nPixelClockSet = 86;	//设置为80MHz
	nRet = is_PixelClock(hCam, IS_PIXELCLOCK_CMD_SET, (void*)&nPixelClockSet, sizeof(nPixelClockSet));
	if (nRet == IS_SUCCESS) {
   
		cout << "Success, and user set pixel clock is : " << nPixelClockSet << " MHz." << endl;
	}
	else {
   
		cout << "Failed to set pixel clock" << endl;
		return IS_NO_SUCCESS;
	}
	// 获取当前像素时钟
	nRet = is_PixelClock(hCam, IS_PIXELCLOCK_CMD_GET, (void*)&nPixelClockCurrent, sizeof(nPixelClockCurrent));
	if (nRet == IS_SUCCESS) {
   
		cout << "Success, and current pixel clock is : " << nPixelClockCurrent << " MHz." << endl;
	}
	else {
   
		cout << "Failed to get current pixel clock" << endl;
		return IS_NO_SUCCESS;
	}
	cout << "***********************************************************************************" << endl;
	/*
	// 相机帧率范围查询与设置
	double nFrameMin, nFrameMax, nFrameIntervall;
	nRet = is_GetFrameTimeRange(hCam, &nFrameMin, &nFrameMax, &nFrameIntervall);
	if (nRet == IS_SUCCESS) {
		cout << "Success, Min Frame = " << 1 / nFrameMax << "fps, Max Frame = " << 1 / nFrameMin << "fps, and Frame Intervall = " << nFrameIntervall << "fps." << endl;
	}
	else {
		cout << "Failed to get nFrameMin, nFrameMax, nFrameIntervall." << endl;
		return IS_NO_SUCCESS;
	}
	*/

	// 设置、并查询 当前相机采集帧率
	double nFramesPerSecondCurrent;
	nRet = is_SetFrameRate(hCam

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

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

相关文章

美易官方:华尔街分析师最青睐的股票过去五年表现怎么样

华尔街分析师一直被视为金融市场的风向标&#xff0c;他们的推荐和预测往往能影响投资者的决策。然而&#xff0c;分析师的预测并不总是准确无误的&#xff0c;特别是在变幻莫测的股市中。那么&#xff0c;我们不禁要问&#xff0c;华尔街分析师最青睐的股票在过去五年中的表现…

OpenHarmony实战:小型系统移植概述

驱动主要包含两部分&#xff0c;平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等&#xff1b;器件驱动则主要包含通常在SOC外的器件&#xff0c;如 LCD、TP、WLAN等 图1 OpenHarmony 驱动分类 HDF驱动被设计为可以跨OS使用的驱动程序&#xff0c;HDF驱动框…

单总线及DS18B20

目录 单总线 单总线介绍 单总线的电路规范 单总线时序结构 初始化 代码理解 发送一位 代码理解 接收一位 代码理解 发送一个字节 代码理解 接收一个字节 代码理解 DS18B20 DS18B20介绍 引脚及应用电路 内部结构 存储器结构 DS18B20操作流程 ROM指令 功能…

大厂面试之【Redis持久化机制】 - RDB和AOF概述及应用配置

文章目录 Redis持久化1. RDB(Redis DataBase)1.1 概述1.2 配置应用 2. AOF(Append Only File)2.1 概述2.2 配置应用 Redis持久化 先上结论&#xff1a;Redis持久化操作分为rdb以及aof&#xff0c;但是前者已经够用 1. RDB(Redis DataBase) 1.1 概述 rdb保存的是dump.rdb文件在指…

基于springboot实现校园资料分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园资料分享平台演示 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…

C++ 11是如何封装Thread库的?

引言 C11 标准引入了一个重要的特性&#xff0c;即原生线程支持&#xff0c;这标志着C语言在并发编程领域迈出了坚实的步伐。在此之前&#xff0c;开发人员在进行跨平台的多线程编程时&#xff0c;不得不依赖于操作系统提供的特定API&#xff0c;如Windows API或POSIX Threads…

开发环境->生产环境

1、数据迁移 不涉及docker # 以数据库用户导出数据 mysqldump -h 192.168.1.168 -P 3307 -u abragent -pabragebb17 abragent > abragent.sql# 以root用户导出数据 mysqldump -h 192.168.1.168 -P 3307 -u root -p8d3Ba1b abragent > abragent.sql 涉及docker …

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC&#xff1a;RK3568 system&#xff1a;Android12 概述&#xff1a; 1. 概述 Ashmem&#xff08;Anonymous Shared Memory&#xff0c;Android 匿名共享内存&#xff09;&#xff0c;它基于 mmap 系统调用&#xff0c;可以让不同进程将同一段…

数据恢复工具哪个成功率高?十大数据恢复软件榜单

数据恢复软件可以恢复损坏或删除的数据。使用数据恢复软件恢复存储在安全位置的剩余信息。您可能会因意外删除文件、文件系统逻辑损坏甚至存储故障等各种原因而丢失数据。执行查看、复制、扫描、识别或提取存储设备中已删除扇区的数据等操作。恢复虚拟存储在任何设备&#xff0…

【算法练习】27:冒泡排序学习笔记

一、冒泡排序的算法思想 原理&#xff1a;以升序为例&#xff0c;冒泡排序通过从左往右连续比较相邻元素&#xff0c;当发现左边比右边大就交换元素。从左往右依次比较完称为“一轮”&#xff0c;每轮结束之后就会固定一个元素。 时间复杂度&#xff1a;2层循环&#xff0c;所以…

windows安装Openssl

openssl官网:[ Downloads ] - /source/index.html Windows 安装方法 OpenSSL 官网没有提供 Windows 版本的安装包&#xff0c;可以选择其他开源平台提供的工具 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 等待下载完成 捐不起 配置环境变量 ope…

Maven依赖管理项目构建工具

一 Maven简介 1.1、Maven是一个依赖管理工具 1.1.1 jar 包的规模 随着我们使用越来越多的框架&#xff0c;或者框架封装程度越来越高&#xff0c;项目中使用的jar包也越来越多。项目中&#xff0c;一个模块里面用到上百个jar包是非常正常的。 比如下面的例子&#xff0c;我…

内存管理机制SLAB

1. 为什么需要内存分配管理&#xff1f;为什么需要SLAB&#xff1f; 在学习c语言时&#xff0c;我们常常会使用到malloc()去申请一块内存空间&#xff0c;用于存放我们的数据&#xff0c;这是代码层面的语言 如果我们想要关心malloc这个命令向系统发出后&#xff0c;系统会做什…

HTMLCSSJS

HTML基本结构 <html><head><title>标题</title></head><body>页面内容</body> </html> html是一棵DOM树, html是根标签, head和body是兄弟标签, body包括内容相关, head包含对内容的编写相关, title 与标题有关.类似html这种…

cdp集群扩容节点磁盘挂载失败原因和解决办法

问题说明 之前在对cdp集群扩容节点环境配置时 按照文档挂载磁盘 在最后一步挂载时&#xff0c;发现有块磁盘没挂载上去 可以看到本该挂载到/data5目录的磁盘sdf1被挂到了/data1上面 查看挂载点文件 vim /etc/fstab问题分析&#xff1a; 发现之前在设置挂载点的时候挂载目录…

gpt4.0中文版

我愿把这个网站成为全球最强AI网站&#xff01;弄100多个AI伺候你&#xff1f;&#xff1f; 家人们&#xff0c;你们猜我发现了什么牛逼的AI网站&#xff1f;&#xff1f; 直接上图&#xff1a; 编辑 这个网站&#xff0c;聚合了国内外100多个顶尖的AI&#xff0c;包括了Op…

AI技术在金融领域/银行业的应用和风险

前言 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经在各行各业得到了广泛的应用&#xff0c;其中包括银行业。银行业作为经济的重要组成部分&#xff0c;一直在不断地探索和应用新技术&#xff0c;以提升服务效率、风险管理和客户体验。然而&…

解决nvm切换node版本失败的终极办法,亲测有效!

问题 当我们有多个前端项目&#xff0c;但是使用的node版本不相同&#xff0c;这就需要我们在启动不同项目时切换node版本&#xff0c;很麻烦&#xff0c;这时有一个叫nvm的好东西可以帮我们快速切换node版本。 但是&#xff0c;nvm安装有一个巨大的坑点&#xff1a;nvm use …

二、GitLab相关操作

GitLab相关操作 一、组、用户、项目管理1.创建组2.创建项目3.创建用户并分配组3.1 创建用户3.2 设置密码3.3 给用户分配组 二、拉取/推送代码1.配置ssh(第一次需要)1.1 创建一个空文件夹1.2 配置本地仓账号和邮箱1.3 生成ssh公钥密钥1.4 gitlab配置公钥 2.拉取代码3.推送代码3.…

Linux gcc day3

find命令&#xff08;importance&#xff09;&#xff1a; 语法&#xff1a;find pathname -options find /root -name test.c which命令&#xff1a; which [指令] 只搜索指令&#xff0c;在什么位置下 为什么文件夹带有颜色呢&#xff1f; 科普补充alias命令&#xff1a; ali…