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

通过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 variblesHIDS	m_hCam;				// 相机句柄HWND	m_hWndDisplay;		 // window显示句柄INT		m_nColorMode;		// Y8/RGB16/RGB24/REG32INT		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 IDchar*	m_pcImageMemory;	// camera memory - pointer to bufferSENSORINFO m_sInfo;		// sensor information structINT     m_nRenderMode;		// render  modeINT     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;	//设置为80MHznRet = 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, nFramePerSecondSet, &nFramesPerSecondCurrent);if (nRet == IS_SUCCESS) {cout << "Success, user set frame is: " << nFramePerSecondSet << "fps, and current frame is : " << (nFramesPerSecondCurrent) << "fps" << endl;}else {cout << "Failed to get current frame" << endl;return IS_NO_SUCCESS;}cout << "***********************************************************************************" << endl;// 曝光时间查询与设置double nExposureTimeDefault, nExposureTimeCurrent;/*  // 获取曝光时间范围查询 这个通过和IDS程序对比,是对的//Success, and exposure time range is : min = 0.00898246 ms, max = 19.9832ms, delta = 0.0158596ms. IS_EXPOSURE_CMD_GET_EXPOSURE_RANGE//Success, and exposure time range is : min = 0.00898246 ms, max = 19.9832ms, delta = 0.000140351ms. IS_EXPOSURE_CMD_GET_FINE_INCREMENT_RANGEdouble nExposureTimeRange;double dblRange[3];nRet = is_Exposure(hCam, IS_EXPOSURE_CMD_GET_FINE_INCREMENT_RANGE, (void*)dblRange, sizeof(dblRange));if (nRet == IS_SUCCESS) {cout << "Success, and exposure time range is : min = " << (dblRange[0]) << " ms, max = "<< (dblRange[1]) << "ms, delta = " << (dblRange[2]) << "ms." << endl;}else {cout << "Failed to get exposure time range" << endl;return IS_NO_SUCCESS;}// 获取默认曝光时间nRet = is_Exposure(hCam, IS_EXPOSURE_CMD_GET_EXPOSURE_DEFAULT, &nExposureTimeDefault, sizeof(nExposureTimeDefault));if (nRet == IS_SUCCESS) {cout << "Success, and default exposure time is : " << nExposureTimeDefault << " ms." << endl;}else {cout << "Failed to get default exposure time" << endl;return IS_NO_SUCCESS;}*/// 设置曝光时间(单位:ms)nRet = is_Exposure(hCam, IS_EXPOSURE_CMD_SET_EXPOSURE, &nExposureTimeSet, sizeof(nExposureTimeSet));if (nRet == IS_SUCCESS) {cout << "Success, and set exposure time is : " << nExposureTimeSet << " ms." << endl;}else {cout << "Failed to set exposure time" << endl;return IS_NO_SUCCESS;}// 再次获取曝光时间,确保设置成功nRet = is_Exposure(hCam, IS_EXPOSURE_CMD_GET_EXPOSURE, &nExposureTimeCurrent, sizeof(nExposureTimeCurrent));if (nRet == IS_SUCCESS) {cout << "Success, and current exposure time is : " << nExposureTimeCurrent << " ms." << endl;}else {cout << "Failed to get current exposure time" << endl;return IS_NO_SUCCESS;}cout << "***********************************************************************************" << endl;return IS_SUCCESS;
}

保存图像函数设置

int SaveIdsImage(HIDS hCam, wchar_t* fileName) {IMAGE_FILE_PARAMS ImageFileParams;// 每次保存图像之前,都要先进行清空指针ImageFileParams.pwchFileName = NULL;ImageFileParams.pnImageID = NULL;ImageFileParams.ppcImageMem = NULL;ImageFileParams.nQuality = 0;//保存活动内存中的bmp图像,图像画质为80(不含”打开文件”对话框)ImageFileParams.pwchFileName = fileName; // L"test.bmp";ImageFileParams.nFileType = IS_IMG_BMP;ImageFileParams.nQuality = 80;int nRet = is_ImageFile(hCam, IS_IMAGE_FILE_CMD_SAVE, (void*)&ImageFileParams, sizeof(ImageFileParams));return nRet;
}

电控位移台头文件

#ifndef MOVERLIBRARY_H
#define MOVERLIBRARY_H#ifdef __cplusplus
#ifdef MOVER_LIBRARY
#define DLL_EXPORT extern "C" __declspec( dllexport )
#else
#define DLL_EXPORT extern "C" __declspec( dllimport )
#endif
#else
#define DLL_EXPORT
#endif#define MOVE_CODE_STOP      0x01    // 停止
#define MOVE_CODE_RESTORE   0x02    // 回原点
#define MOVE_CODE_DRIVE_R   0x04    // 向右相对运动
#define MOVE_CODE_DRIVE_L   0x05    // 向左相对运动
#define MOVE_CODE_MOVE      0x06    // 运动到指定位置
#define MOVE_CODE_JOG_R     0x07    // 向右步进
#define MOVE_CODE_JOG_L     0x08    // 向左步进DLL_EXPORT int listPorts(char *serialNo, unsigned int len); // 列举串口设备
DLL_EXPORT int open(char *serialNo);                        // 打开串口设备
DLL_EXPORT int isOpen(char *serialNo);                      // 检查串口设备是否已打开
DLL_EXPORT int close(int handle);                           // 关闭串口设备
DLL_EXPORT int read(int handle, char *data, int len);       // 读取数据
DLL_EXPORT int write(int handle, char *data, int len);      // 写入数据// 设置D寄存器
DLL_EXPORT int move(int handle, int ID, int func);              // 运行
DLL_EXPORT int setSpeed(int handle, int ID, float speed);       // 设置速度
DLL_EXPORT int setAcceleration(int handle, int ID, float Acc);  // 设置加速度
DLL_EXPORT int setAbsoluteDisp(int handle, int ID, float disp); // 设置绝对位移量
DLL_EXPORT int setRelativeDisp(int handle, int ID, float disp); // 设置相对位移量
DLL_EXPORT int setJogTime(int handle, int ID, int time);        // 设置步进时间
DLL_EXPORT int setJogStep(int handle, int ID, float step);      // 设置步进步长
DLL_EXPORT int setJogDelay(int handle, int ID, int delay);      // 设置步进延迟DLL_EXPORT int setInputEnable(int handle, int ID, int enable);              // 输入有效
DLL_EXPORT int setOutputEnable(int handle, int ID, int enable);             // 输出有效
DLL_EXPORT int setAxisEnable(int handle, int ID, int enable);               // 轴使能
DLL_EXPORT int setRelativePosEnable(int handle, int ID, int enable);        // 相对位置值使能// 只读
DLL_EXPORT int getDoingState(int handle, int ID);           // 运动状态
DLL_EXPORT int getPositiveLimitEnable(int handle, int ID);  // 限位+
DLL_EXPORT int getNegativeLimitEnable(int handle, int ID);  // 限位-
DLL_EXPORT int getOriginEable(int handle, int ID);          // 原点
DLL_EXPORT int getDeviceCode(int handle);                   // 控制器设备型号(支持的轴数量)// 获取寄存器值
DLL_EXPORT float getSpeed(int handle, int ID);          // 速度
DLL_EXPORT float getAcceleration(int handle, int ID);   // 加速度
DLL_EXPORT float getAbsoluteDisp(int handle, int ID);   // 绝对位移量
DLL_EXPORT float getRelativeDisp(int handle, int ID);   // 相对位移量
DLL_EXPORT int getJogTime(int handle, int ID);          // 步进时间
DLL_EXPORT float getJogStep(int handle, int ID);        // 步进步长
DLL_EXPORT int getJogDelay(int handle, int ID);         // 步进延迟DLL_EXPORT int getAxisType(int handle, int ID);             // 轴类型
DLL_EXPORT float GetCurrentPos(int handle, int ID, int *ok);// 当前位置
DLL_EXPORT int getInputEnable(int handle, int ID);          // 输入有效
DLL_EXPORT int getOutputEnable(int handle, int ID);         // 输出有效
DLL_EXPORT int getAxisEnable(int handle, int ID);           // 轴使能
DLL_EXPORT int getRelativePosEnable(int handle, int ID);    // 相对位置值使能,未使能时,drive不需要设置位移量DLL_EXPORT int getAllModels(char* modelName, int len);      // 获取所有位移台型号名称用","隔开
DLL_EXPORT int initAxis(int handle, int ID, char* model, int AxisCount);   // 初始化轴
DLL_EXPORT int getErrorCode(int handle, int ID);            // 获取错误代码#endif // MOVERLIBRARY_H

电控位移台设置参数

// 位移台运动函数设置:
int LBtekMoverParaSet() {cout << "***************** Loading moverLibrary_x64.dll, Get and Init Mover Device. *******************" << endl;// 运行时加载DLL库HMODULE dllHandle = LoadLibrary(L"moverLibrary_x64.dll");if (dllHandle == NULL){printf("加载DLLTest1.dll动态库失败\n");return -1;}// 获取listPorts函数地址MyFunctionType1 GetMoverSerialList = (MyFunctionType1)GetProcAddress(dllHandle, "listPorts");/*if (GetMoverSerialList == NULL) {std::cout << "Failed to get function address." << std::endl;return -1;}*/// 通过GetMoverSerialList调用函数listPorts ret = GetMoverSerialList(serialList, 1024);		// 获取当前电脑所有已连接的串口设备名称列表 我们的应该是COM5if (ret >= 0) {cout << "Success to get Serial List:" << serialList << std::endl;}else {cout << "Failed to get Serial List!" << std::endl;return -1;}// 获取位移台型号名称列表 我们的应该是 EM-LSS65-50C1MyFunctionType1 GetMoverModelsList = (MyFunctionType1)GetProcAddress(dllHandle, "getAllModels");ret = GetMoverModelsList(modelsList, 1024);if (ret >= 0) {cout << "Success to get Mover Model List:" << modelsList << std::endl;}else {cout << "Failed to get Mover Model List!" << std::endl;return -1;}// 打开串口设备             MyFunctionType2 OpenMoverEmcvx = (MyFunctionType2)GetProcAddress(dllHandle, "open");	// 打开串口设备int open(char *serialNo); m_handle = OpenMoverEmcvx(name);if (ret > 0) {cout << "Success to Open Emcvx." << endl;}else {cout << "Failed to Open Emcvx." << endl;return -1;}/*// 检查串口设备是否正确打开MyFunctionType2 CheckMoverEmcvxState = (MyFunctionType2)GetProcAddress(dllHandle, "isOpen");	//if (CheckMoverEmcvxState(name) > 0) {cout << "Success to Open Emcvx.(Check)" << endl;}else {cout << "Failed to Open Emcvx.(Check)" << endl;return -1;}*/// 初始化轴设备 Axis1MyFunctionType7 InitMoverAxis = (MyFunctionType7)GetProcAddress(dllHandle, "initAxis");MyFunctionType8 GetMoverDeviceCode = (MyFunctionType8)GetProcAddress(dllHandle, "getDeviceCode");int axisCount = GetMoverDeviceCode(m_handle);	// 获取轴设备数量cout << "Axis Count = " << axisCount << endl;if (InitMoverAxis(m_handle, ID, modelName, axisCount) >= 0) {cout << "Success to Init Mover Axis 1." << endl;}else {cout << "Failed to Init Mover Axis 1." << endl;return -1;}cout << "************************************ Setting Device Paras. ******************************" << endl;// 设置运行速度MyFunctionType5 SetMoverSpeed = (MyFunctionType5)GetProcAddress(dllHandle, "setSpeed");if (SetMoverSpeed(m_handle, ID, speed) == 0) {cout << "Success to Set Mover Speed at " << speed << endl;}else {cout << "Failed to Set Mover Speed." << endl;return -1;}// 设置运行加速度MyFunctionType5 SetMoverAcceleration = (MyFunctionType5)GetProcAddress(dllHandle, "setAcceleration");if (SetMoverAcceleration(m_handle, ID, Acc) == 0) {cout << "Success to Set Mover Acc at " << Acc << endl;}else {cout << "Failed to Set Mover Acc." << endl;return -1;}// 设置运行相对位移量MyFunctionType5 SetMoverRelativeDisp = (MyFunctionType5)GetProcAddress(dllHandle, "setRelativeDisp");if (SetMoverRelativeDisp(m_handle, ID, disp) == 0) {cout << "Success to Set Mover Relative Disp at " << disp << "mm" << endl;}else {cout << "Failed to Set Mover Relative Disp." << endl;return -1;}// 设置步进次数MyFunctionType4 SetMoverJogTime = (MyFunctionType4)GetProcAddress(dllHandle, "setJogTime");if (SetMoverJogTime(m_handle, ID, times) == 0) {cout << "Success to Set Mover Jog Times at " << times << endl;}else {cout << "Failed to Set Mover Jog Times." << endl;return -1;}// 设置步进步长MyFunctionType5 SetMoverJogStep = (MyFunctionType5)GetProcAddress(dllHandle, "setJogStep");if (SetMoverJogStep(m_handle, ID, step) == 0) {cout << "Success to Set Mover Jog Step at " << speed << endl;}else {cout << "Failed to Set Mover Jog Step." << endl;return -1;}// 设置步进延时MyFunctionType4 SetMoverJogDelay = (MyFunctionType4)GetProcAddress(dllHandle, "setJogDelay");if (SetMoverJogDelay(m_handle, ID, times) == 0) {cout << "Success to Set Mover Jog Delay at " << delay << "ms" << endl;}else {cout << "Failed to Set Mover Jog Delay." << endl;return -1;}// 设置位移台轴使能MyFunctionType4 SetMoverAxisEnable = (MyFunctionType4)GetProcAddress(dllHandle, "setAxisEnable");if (SetMoverAxisEnable(m_handle, ID, 0x01) == 0) {	// 0x00未使能; 0x01使能cout << "Success to Enable Mover." << endl;}else {cout << "Failed to Enable Mover." << endl;return -1;}// 获取位移台运行状态MyFunctionType6 GetMoverDoingState = (MyFunctionType6)GetProcAddress(dllHandle, "getDoingState");ret = GetMoverDoingState(m_handle, ID);if (ret == 0x01) {cout << "Success to get the state of Mover, and it is running." << endl;}else if (ret == 0) {cout << "Success to get the state of Mover, but it isn't running." << endl;}else {cout << "Failed to get the state of Mover!" << endl;return -1;}// 获取位移台当前位置 float GetCurrentPos(int handle, int ID, int *ok);// 当前位置MyFunctionType3 GetMoverCurrentPos = (MyFunctionType3)GetProcAddress(dllHandle, "GetCurrentPos");int signOK = 0;currentPos = GetMoverCurrentPos(m_handle, ID, &signOK);if (currentPos >= 0) {	// 0x00未使能; 0x01使能cout << "Success to Get Mover Current Position at " << currentPos << " mm" << endl;}else {cout << "Failed to Get Mover Current Position." << endl;return -1;}// 获取位移台正方向限位状态MyFunctionType6 GetMoverPositiveLimitEnable = (MyFunctionType6)GetProcAddress(dllHandle, "getPositiveLimitEnable");int limitMaxState = GetMoverPositiveLimitEnable(m_handle, ID);if (limitMaxState == 0x01) {cout << "Warrning! It is Located in limitMaxState!" << endl;}else if (ret == 0) {cout << "Success to check, it isn't at limitMaxState." << endl;}else {cout << "Failed to get the state of limitMaxState!" << endl;return -1;}// 获取位移台负方向限位状态MyFunctionType6 GetMoverNegativeLimitEnable = (MyFunctionType6)GetProcAddress(dllHandle, "getNegativeLimitEnable");int limitMinState = GetMoverNegativeLimitEnable(m_handle, ID);if (limitMinState == 0x01) {cout << "Warrning! It is Located in limitMinState!" << endl;}else if (ret == 0) {cout << "Success to check, it isn't at limitMinState." << endl;}else {cout << "Failed to get the state of limitMinState!" << endl;return -1;}// 使能位移台运动MyFunctionType4 MoverEnable = (MyFunctionType4)GetProcAddress(dllHandle, "move");	// int move(int handle, int ID, int func);	/*// func: 0x01停止	0x02回原点	 0x04正方向推进	0x05负方向推进	0x06移动到指定位置	0x07正反向步进	0x08负方向步进ret = MoverEnable(m_handle, ID, 0x07);if (ret == 0) {cout << "Success, Jog move." << endl;}else {cout << "Failed to Jog Move!" << endl;return -1;}*/// 卸载DLL文件  FreeLibrary(dllHandle);return 0;
}

最后就是通过main函数进行调用和控制,需要注意的是,最好能加上sleep函数,这样采集图像不容易出问题

如果有更多需求,欢迎大家私信交流。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.4.1-day06-认识 CSS(三大特性、引入方式)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; day06-认识 CSS(三大特性、引入方式) 文章目录 day06-认识 CSS(三大特性、引入方式)作业…

【频繁模式挖掘】FP-Tree算法(附Python实现)

一、实验内容简介 该实验主要使用频繁模式和关联规则进行数据挖掘&#xff0c;在已经使用过Apriori算法挖掘频繁模式后&#xff0c;这次使用FP-tree算法来编写和设计程序&#xff0c;依然使用不同规模的数据集来检验效果&#xff0c;最后分析和探讨实验结果&#xff0c;看其是…

非线性方程组求解与优化的关系 Nonlinear Optimization

解非线性方程&#xff08;Nonlinear Equations&#xff09;的技术在其动机、分析和算法实现方面与优化技术&#xff08;Optimization&#xff09;有重叠。 相似点&#xff1a; 在优化和非线性方程中&#xff0c;牛顿法是许多重要算法的核心。诸如线搜索、信赖域和每次迭代中线…

nacos分布式程序开发实例

1.通过windows docker desktop 完成 nacos 的安装/启动/配置 &#xff08;1&#xff09;先安装docker desktop docker-toolbox-windows-docker-for-windows-stable安装包下载_开源镜像站-阿里云 &#xff08;2&#xff09;配置docker 国内镜像源 Docker 镜像加速 | 菜鸟教程…

未来的技术发展趋势

文章目录 前言一、人工智能技术势必聚焦安全能力二、单云环境逐渐让位于多云环境三、后量子密码或将在美大范围普及总结前言 2023 年,与网络空间安全息息相关的人工智能等技术发展迅猛,新的信息安全时代已然拉开大幕。在目睹了 ChatGPT、“星链”和量子通信等技术展现出的巨…

[开源] 基于GRU的时间序列预测模型python代码

基于GRU的时间序列预测模型python代码分享给大家&#xff0c;记得点赞哦 #!/usr/bin/env python # coding: utf-8import time time_start time.time() import numpy as np import matplotlib.pyplot as plt import pandas as pd import math from keras.models import Sequent…

Android Studio中查看和修改project的编译jdk版本

android studio中查看和修改project的编译jdk版本操作如下&#xff1a; File->settings->Build,Execution,deployment->Build Tools->Gradles 进入Gradles页面可以查看并修改project的编译jdk版本&#xff0c;如图所示

基于Leaflet.js的Marker闪烁特效的实现-模拟预警

目录 前言 一、闪烁组件 1、关于leaflet-icon-pulse 2、 使用leaflet-icon-pulse 3、方法及参数简介 二、闪烁实例开发 1、创建网页 2、Marker闪烁设置 3、实际效果 三、总结 前言 在一些地质灾害或者应急情况当中&#xff0c;或者热门预测当中。我们需要基于时空位置来…

在数字化转型的背景下,如何构建高效的数据资产管理体系?

在数字化转型的大潮中&#xff0c;数据已成为企业创新发展的重要驱动力。如何高效地管理这些数据资产&#xff0c;不仅关系到企业的日常运营&#xff0c;更直接决定了企业能否在激烈的市场竞争中脱颖而出。对于企业管理者或首席信息官&#xff08;CIO&#xff09;而言&#xff…

景芯2.5GHz A72训练营dummy添加(一)

景芯A72做完布局布线之后导出GDS&#xff0c;然后进行GDS merge&#xff0c;然后用Calibre对Layout添加Dummy。在28nm以及之前的工艺中&#xff0c;Dummy metal对Timing的影响不是很大&#xff0c;当然Star RC也提供了相应的解决方案&#xff0c;可以考虑Dummy metal来抽取RC。…

C++11可变模板参数:海纳百川的Args

目录 一、可变模板参数的概念及功能 1.1Args的概念与使用 1.2获取args中的参数 二、emplace可变模板参数的实际应用 三、逗号表达式展开参数包 一、可变模板参数的概念及功能 1.1Args的概念与使用 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板…

Mysql安装(命令方式安装)

下载mysql压缩包 Mysql可以使用界面安装&#xff0c;也可以使用命令的方式安装&#xff0c;今天我们使用命令的方式安装mysql。首先下载mysql压缩包&#xff08;下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/&#xff09;&#xff0c;解压到你想要安装的目录。 …