Ubuntu 连接海康智能相机步骤(亲测,成功读码)

ubuntu20.04下连接海康智能相机

    • Ubuntu 连接海康智能相机步骤(亲测,已成功读码)
    • 输出的结果

Ubuntu 连接海康智能相机步骤(亲测,已成功读码)

(就是按照海康的提供的步骤和源码连接相机,流水账)

  1. 安装Ubuntu20.04
  2. 安装gcc和g++,IDmvs只提供了C代码,所以需要自己make编译,自己去搜下怎么安装。
  3. 官网下载IDMVS软件,进入海康机器人页面,进入下载选项,,选择客户端下载,第二页,选择里面的IDMVS(linux)
  4. 解压安装,我是用deb文件安装的,选择X86_64版本。
  5. 安装完成后,在菜单栏里面有IDMVS图标,可以直接打开,或者进入/opt/IDMVS/bin/,运行./IDMVS.sh,两种方法都能打开客户端。
  6. 连接相机,如果没有找到相机你可以在windows上先连下相机试试,然后设定固定IP,连接相机
  7. 连上之后,进入/opt/IDMVS/有个demo的文件夹,具体在哪里忘记了,可以找一下,
  8. IDMVS只提供了两个demo,进入/GrabImage/目录下,应该只有两个文件,一个GrabImage.c,一个makefile。

在这里插入图片描述

  1. 然后把上级目录下的/sdk/里面的.so文件放到/GrabImage/目录下。
  2. 然后sudo make(如果你之前装好了g++和gcc,应该可以make成功)
  3. 执行生成后的文件。./GrabImage,就OK了,选择你想要连接的相机。就能看到获取到的结果了。

以下是GrabImage.c的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>#include <cstdlib>
#include <string>
#include <iconv.h>#include "MvCodeReaderParams.h"
#include "MvCodeReaderErrorDefine.h"
#include "MvCodeReaderCtrl.h"bool g_bExit = false;
// ch:中文转换条码长度定义 | en:Chinese coding format len
#define MAX_BCR_LEN  512// ch:中文编码GB2312格式转换UTF_8 | en: Chinese coding format GB2312 to utf_8
int GB2312ToUTF8(char* szSrc, size_t iSrcLen, char* szDst, size_t iDstLen)
{iconv_t cd = iconv_open("utf-8//IGNORE", "gb2312//IGNORE");if(0 == cd){return -2;  }memset(szDst, 0, iDstLen);char **src = &szSrc;char **dst = &szDst;if(-1 == (int)iconv(cd, src, &iSrcLen, dst, &iDstLen)){return -1; }iconv_close(cd);return 0;
}// ch:等待用户输入enter键来结束取流或结束程序
// en:wait for user to input enter to stop grabbing or end the sample program
void PressEnterToExit(void)
{int c;while ( (c = getchar()) != '\n' && c != EOF );fprintf( stderr, "\nPress Enter to exit.\n");while( getchar() != '\n');g_bExit = true;usleep(1);
}// ch:打印设备信息 | en:Print device Info
bool PrintDeviceInfo(MV_CODEREADER_DEVICE_INFO* pstMVDevInfo)
{if (NULL == pstMVDevInfo){printf("The Pointer of pstMVDevInfo is NULL!\r\n");return false;}if (MV_CODEREADER_GIGE_DEVICE == pstMVDevInfo->nTLayerType){int nIp1 = ((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24);int nIp2 = ((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16);int nIp3 = ((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8);int nIp4 = (pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff);// ch:打印当前相机ip和用户自定义名字 | en:print current ip and user defined nameprintf("CurrentIp: %d.%d.%d.%d\r\n" , nIp1, nIp2, nIp3, nIp4);printf("UserDefinedName: %s\r\n\n" , pstMVDevInfo->SpecialInfo.stGigEInfo.chUserDefinedName);}else if (MV_CODEREADER_USB_DEVICE == pstMVDevInfo->nTLayerType){printf("UserDefinedName: %s\r\n\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName);}else{printf("Not support.\r\n");}return true;
}// ch:获取图像线程 | en:Get Image Thread
static void* GrabImageThread(void* pUser)
{int nRet = MV_CODEREADER_OK;MV_CODEREADER_IMAGE_OUT_INFO_EX2 stImageInfo = {0};memset(&stImageInfo, 0, sizeof(MV_CODEREADER_IMAGE_OUT_INFO_EX2));unsigned char * pData = NULL;while(1){if (g_bExit){break;}nRet = MV_CODEREADER_GetOneFrameTimeoutEx2(pUser, &pData, &stImageInfo, 1000);if (nRet == MV_CODEREADER_OK){MV_CODEREADER_RESULT_BCR_EX* stBcrResult = (MV_CODEREADER_RESULT_BCR_EX*)stImageInfo.pstCodeListEx;printf("Get One Frame: nChannelID[%d] Width[%d], Height[%d], nFrameNum[%d], nTriggerIndex[%d]\n", stImageInfo.nChannelID, stImageInfo.nWidth, stImageInfo.nHeight, stImageInfo.nFrameNum, stImageInfo.nTriggerIndex);printf("CodeNum[%d]\n", stBcrResult->nCodeNum);char strChar[MAX_BCR_LEN] = {0};for (int i = 0; i < stBcrResult->nCodeNum; i++){memset(strChar, 0, MAX_BCR_LEN);nRet = GB2312ToUTF8(stBcrResult->stBcrInfoEx[i].chCode, strlen(stBcrResult->stBcrInfoEx[i].chCode), strChar, MAX_BCR_LEN);if (nRet == MV_CODEREADER_OK){printf("CodeNum[%d] Code[%s]\r\n", i, strChar);}else{printf("CodeNum[%d] Code[%s]\r\n", i, stBcrResult->stBcrInfoEx[i].chCode);}				}}else{printf("No data[0x%x]\r\n", nRet);}}return 0;}// ch:主处理函数 | en:main process
int main()
{int nRet = MV_CODEREADER_OK;void* handle = NULL;bool bIsNormalRun = true;do{MV_CODEREADER_DEVICE_INFO_LIST stDeviceList;memset(&stDeviceList, 0, sizeof(MV_CODEREADER_DEVICE_INFO_LIST));// ch:枚举设备 | Enum devicenRet = MV_CODEREADER_EnumDevices(&stDeviceList, MV_CODEREADER_GIGE_DEVICE);if (MV_CODEREADER_OK != nRet){printf("Enum Devices fail! nRet [%#x]\r\n", nRet);break;}else{printf("Enum Devices succeed!\r\n");}if (stDeviceList.nDeviceNum > 0){for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++){printf("[device %d]:\r\n", i);MV_CODEREADER_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo){break;}PrintDeviceInfo(pDeviceInfo);}}else{printf("Find No Devices!\r\n");break;}printf("Please Intput camera index:");unsigned int nIndex = 0;scanf("%d", &nIndex);if (nIndex >= stDeviceList.nDeviceNum){printf("Intput error!\r\n");break;}// ch:选择设备并创建句柄 | Select device and create handlenRet = MV_CODEREADER_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);if (MV_CODEREADER_OK != nRet){printf("Create Handle fail! nRet [%#x]\r\n", nRet);break;}else{printf("Create Handle succeed!\r\n");}// ch:打开设备 | Open devicenRet = MV_CODEREADER_OpenDevice(handle);if (MV_CODEREADER_OK != nRet){printf("Open Device fail! nRet [%#x]\r\n", nRet);break;}else{printf("Open Device succeed!\r\n");}// ch:设置触发模式为off | eb:Set trigger mode as offnRet = MV_CODEREADER_SetEnumValue(handle, "TriggerMode", MV_CODEREADER_TRIGGER_MODE_OFF);if (MV_CODEREADER_OK != nRet){printf("Set Trigger Mode fail! nRet [%#x]\r\n", nRet);break;}else{printf("Set Trigger Mode succeed!\r\n");}// ch:开始取流 | en:Start grab imagenRet = MV_CODEREADER_StartGrabbing(handle);if (MV_CODEREADER_OK != nRet){printf("Start Grabbing fail! nRet [%#x]\r\n", nRet);break;}else{printf("Start Grabbing succeed!\r\n");}pthread_t nThreadID;nRet = pthread_create(&nThreadID, NULL, GrabImageThread, handle);if (MV_CODEREADER_OK != nRet){printf("Thread create failed! nRet [%d]\r\n", nRet);break;}PressEnterToExit();nRet = pthread_join(nThreadID, NULL);if (MV_CODEREADER_OK != nRet){printf("Thread free failed! nRet = [%d]\r\n", nRet);bIsNormalRun = false;break;}// ch:停止取流 | en:Stop grab imagenRet = MV_CODEREADER_StopGrabbing(handle);if (MV_CODEREADER_OK != nRet){printf("Stop Grabbing fail! nRet [%#x]\r\n", nRet);bIsNormalRun = false;break;}else{printf("Stop Grabbing succeed!\r\n");}// ch:关闭设备 | en:close devicenRet = MV_CODEREADER_CloseDevice(handle);if (MV_CODEREADER_OK != nRet){printf("MV_CODEREADER_CloseDevice fail! nRet [%#x]\r\n", nRet);bIsNormalRun = false;break;}else{printf("MV_CODEREADER_CloseDevice succeed!\r\n");}// ch:销毁句柄 | en:Destroy handlenRet = MV_CODEREADER_DestroyHandle(handle);if (MV_CODEREADER_OK != nRet){printf("MV_CODEREADER_DestroyHandle fail! nRet [%#x]\r\n", nRet);bIsNormalRun = false;break;}else{handle = NULL;printf("MV_CODEREADER_DestroyHandle succeed!\r\n");}} while (0);if (handle != NULL){// ch:关闭设备 | en:Close device// ch:销毁句柄 | en:Destroy handleMV_CODEREADER_CloseDevice(handle);MV_CODEREADER_DestroyHandle(handle);handle = NULL;}if (bIsNormalRun){printf("Exit!\r\n");		}if (false == bIsNormalRun){PressEnterToExit();printf("Exit!\r\n");}return 0;}

输出的结果

在这里插入图片描述

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

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

相关文章

OpenHarmony Meetup 广州站 OpenHarmony正当时—技术开源

招募令 OpenHarmony Meetup 广州站 火热招募中&#xff0c;等待激情四射的开发者&#xff0c;线下参与OpenHarmonyMeetup线下交流 展示前沿技术、探讨未来可能、让你了解更多专属OpenHarmony的魅力 线下参与&#xff0c;先到先得,仅限20个名额&#xff01; 报名截止时间8月23日…

python_PyQt5运行股票研究python方法工具V1.2_增加折线图控件

承接【python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件】 地址&#xff1a;python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件_程序猿与金融与科技的博客-CSDN博客 目录 结果展示&#xff1a; 代码&#xff1a; 示例py文件代码&#xff08;低位股…

STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置&#xff0c;文章提供原理&#xff0c;代码&#xff0c;测试工程下载。 目录 时钟树与时钟系统&#xff1a; 滴答计时器&#xff1a; 定时器计时中断&#xff1a; 测试结果&#xff1a; 测…

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计学习小结参考资料效果一览

大数据_SLA,SLO,SLI 名词解读

参考 &#xff1a; SLI、SLO和SLA&#xff0c;一文彻底搞懂&#xff01;&#xff01;&#xff01;_木给哇啦丶的博客-CSDN博客 前言 SLO和SLA是大家常见的两个名词&#xff1a;服务等级目标和服务等级协议。 云计算时代&#xff0c;各大云服务提供商都发布有自己服务的 SLA 条…

【CHI】(三)网络层

网络层负责确定目标节点的NodeID。本章包含以下部分&#xff1a; 系统地址映射&#xff0c;SAM节点ID目标ID确定网络层flow示例 1. System address map 系统中每个Requester(包括RN和HN)必须有一个System Address Map(SAM)来决定一个request的target ID。SAM的范围可能只是简…

基于PSO-KELM的时间序列数据预测(含对比实验)

前段时间有粉丝私信想让我出一期对时间序列预测的文章&#xff0c;所以今天它来了。 时间序列数据&#xff0c;如股指价格&#xff0c;具有波动性、非线性和突变的特点&#xff0c;对于这类数据的预测往往需要可靠强健的预测模型&#xff0c;而传统的机器学习算法如SVM、BP等…

c51单片机串行通信示例代码(单片机--单片机通信)(附带proteus线路图)

//这个发送端代码 #include "reg51.h" #include "myheader.h" #define uchar unsigned char long int sleep_i0; long int main_i0; void main() {uchar sendx[6]{2,0,2,3,8,1};sleep(2000);TMOD0x20;TH10XF4;//根据波特率计算公式这里需要设置为这么多才能…

02 基于51单片机的LED闪烁实验

目录 前言 一、整体目录结构 二、代码展示 三、main.c代码解析 四、下载到单片机中 总结 前言 前面我们已经学会了点亮一个led的实验&#xff0c;今天我们来实现LED闪烁。前面我们讲到想要让LED亮的话&#xff0c;只要给单片机引脚高电平就好了&#xff0c;如果给LED低电平的话…

竞赛项目 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…

Android 面试笔记整理-Binder机制

作者&#xff1a;浪人笔记 面试可能会问到的问题 从IPC的方式问到Binder的优势为什么zygote跟其他服务进程的通讯不使用BinderBinder线程池和Binder机制 等等这些问题都是基于你对Binder的理解还有对其他IPC通讯的理解 IPC方式有多少种 传统的IPC方式有Socket、共享内存、管道…

LeetCode 1631. Path With Minimum Effort【最小瓶颈路;二分+BFS或DFS;计数排序+并查集;最小生成树】1947

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

流量日志分析--实操

[鹤城杯 2021]流量分析 <--第一道流量分析不难,主要就是布尔盲注的流量包分析,直接查看http请求包即可我们可以通过观察看到注入成功的响应长度不同,这里成功的为978字节,失败的994字节.不要问为什么.其实也可以直接判断.978的流量比994的少了非常多 显然就是成功的(因为这里…

LeetCode--HOT100题(26)

目录 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返…

antd中Switch组件的使用

<Switch> 是 Ant Design 中的一个组件&#xff0c;用于在开关之间切换。checkedChildren 是 <Switch> 组件的一个属性&#xff0c;用于指定在开关打开时显示的文本或 React 元素。 以下是 <Switch> 组件的基本语法&#xff1a; import { Switch } from ant…

【大数据】一些基本概念

一、数据库、数据仓库、数据湖 1.什么是数据库 (Database, DB) 数据库是指长期储存在计算机中的有组织的, 可共享的数据集合 就是存储数据的仓库 数据库有三个特点: 永久存储, 有组织, 可共享 数据库是一种结构化数据存储技术&#xff0c;用于存储和管理有组织的数据。数据库…

在 Linux 中使用 cp 命令

cp 命令是 Linux 中一个重要的命令&#xff0c;你可能经常会用到它。 正如名称所示&#xff0c;cp 代表 复制copy&#xff0c;它被用于 在 Linux 命令行中复制文件和目录。 这是一个相对简单的命令&#xff0c;只有几个选项&#xff0c;但你仍有必要深入了解它。 在展示 cp …

使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件

使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件 文章目录 使用GUI Guider工具开发嵌入式GUI应用 (3) - 使用label组件引言在GUI Guider工程中创建label组件编译MCU工程并下载到开发板 引言 本节讲述在GUI Guider中&#xff0c;应用各种UI的基本元素&#xff0c;并顺…

(十)人工智能应用--深度学习原理与实战--模型的保存与加载使用

目的:将训练好的模型保存为文件,下次使用时直接加载即可,不必重复建模训练。 神经网络模型训练好之后,可以保存为文件以持久存储,这样下次使用时就不重新建模训练,直接加载就可以。TensorfLow提供了灵活的模型保存方案,既可以同时保存网络结构和权重(即保存全模型),也可…

datawhale49期-task02:安装MMSegmentation

task02:安装MMSegmentation 运行环境&#xff1a;window11 ,GPU RTX 4060、CUDA v11.8 1. Pytorch环境 步骤 1. 创建一个 conda 环境&#xff0c;并激活 conda create --name openmmlab python3.8 -y conda activate openmmlabStep 2. 参考 official instructions 安装 PyTor…