大恒水晶相机_大恒工业相机多实例使用
工作环境比较恶劣并且有较多干扰源的环境做视觉识别一般都使用工业相机,大恒水晶相机是比较常用的一种。比起来进口相机,虽然用起来会更麻烦,但好在价格便宜,各项指标也不低。
大恒水晶相机是提供SDK的方式跟OPENCV类的系统做集成,还做不到像很多进口相机一样直接就有了系统级的驱动,这方面的资料还是不少的,下面是在网上摘的一个例子:(来源)
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "GxIAPI.h"
#include "DxImageProc.h"
#include
#include
#include
#include
using namespace std;
using namespace cv;
GX_DEV_HANDLE m_hDevice; ///< 设备句柄
BYTE *m_pBufferRaw; ///< 原始图像数据
BYTE *m_pBufferRGB; ///< RGB图像数据,用于显示和保存bmp图像
int64_t m_nImageHeight; ///< 原始图像高
int64_t m_nImageWidth; ///< 原始图像宽
int64_t m_nPayLoadSize;
int64_t m_nPixelColorFilter; ///< Bayer格式
Mat test;
//图像回调处理函数
static void GX_STDC OnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM* pFrame)
{
//PrepareForShowImg();
if (pFrame->status == 0)
{
//对图像进行某些操作
/*memcpy(m_pBufferRaw, pFrame->pImgBuf, pFrame->nImgSize);
// 黑白相机需要翻转数据后显示
for (int i = 0; i
memcpy(m_pImageBuffer + i*m_nImageWidth, m_pBufferRaw + (m_nImageHeight - i - 1)*m_nImageWidth, (size_t)m_nImageWidth);
}
IplImage* src;
src = cvCreateImage(cvSize(m_nImageWidth, m_nImageHeight), 8, 1);
src->imageData = (char*)m_pImageBuffer;
cvSaveImage("src.jpg", src);*/
memcpy(m_pBufferRaw, pFrame->pImgBuf, pFrame->nImgSize);
// RGB转换
DxRaw8toRGB24(m_pBufferRaw
, m_pBufferRGB
, (VxUint32)(m_nImageWidth)
, (VxUint32)(m_nImageHeight)
, RAW2RGB_NEIGHBOUR
, DX_PIXEL_COLOR_FILTER(m_nPixelColorFilter)
, false);
//cv_Image->imageData = (char*)m_pBufferRGB;
//cvSaveImage("./test.bmp", cv_Image);
//test.data = m_pBufferRaw;
memcpy(test.data, m_pBufferRGB, m_nImageWidth*m_nImageHeight * 3);
imwrite("./test1.bmp", test);
namedWindow("test");
imshow("test", test);
waitKey(15);
}
return;
}
int main(int argc, char* argv[])
{
GX_STATUS emStatus = GX_STATUS_SUCCESS;
GX_OPEN_PARAM openParam;
uint32_t nDeviceNum = 0;
openParam.accessMode = GX_ACCESS_EXCLUSIVE;
openParam.openMode = GX_OPEN_INDEX;
openParam.pszContent = "1";
// 初始化库
emStatus = GXInitLib();
if (emStatus != GX_STATUS_SUCCESS)
{
return 0;
}
// 枚举设备列表
emStatus = GXUpdateDeviceList(&nDeviceNum, 1000);
if ((emStatus != GX_STATUS_SUCCESS) || (nDeviceNum <= 0))
{
return 0;
}
//打开设备
emStatus = GXOpenDevice(&openParam, &m_hDevice);
//设置采集模式连续采集
emStatus = GXSetEnum(m_hDevice, GX_ENUM_ACQUISITION_MODE, GX_ACQ_MODE_CONTINUOUS);
emStatus = GXSetInt(m_hDevice, GX_INT_ACQUISITION_SPEED_LEVEL, 1);
emStatus = GXSetEnum(m_hDevice, GX_ENUM_BALANCE_WHITE_AUTO, GX_BALANCE_WHITE_AUTO_CONTINUOUS);
bool bColorFliter = false;
// 获取图像大小
emStatus = GXGetInt(m_hDevice, GX_INT_PAYLOAD_SIZE, &m_nPayLoadSize);
// 获取宽度
emStatus = GXGetInt(m_hDevice, GX_INT_WIDTH, &m_nImageWidth);
// 获取高度
emStatus = GXGetInt(m_hDevice, GX_INT_HEIGHT, &m_nImageHeight);
test.create(m_nImageHeight, m_nImageWidth, CV_8UC3);
//判断相机是否支持bayer格式
bool m_bColorFilter;
emStatus = GXIsImplemented(m_hDevice, GX_ENUM_PIXEL_COLOR_FILTER, &m_bColorFilter);
if (m_bColorFilter)
{
emStatus = GXGetEnum(m_hDevice, GX_ENUM_PIXEL_COLOR_FILTER, &m_nPixelColorFilter);
}
m_pBufferRGB = new BYTE[(size_t)(m_nImageWidth * m_nImageHeight * 3)];
if (m_pBufferRGB == NULL)
{
return false;
}
//为存储原始图像数据申请空间
m_pBufferRaw = new BYTE[(size_t)m_nPayLoadSize];
if (m_pBufferRaw == NULL)
{
delete[]m_pBufferRGB;
m_pBufferRGB = NULL;
return false;
}
//注册图像处理回调函数
emStatus = GXRegisterCaptureCallback(m_hDevice, NULL, OnFrameCallbackFun);
//发送开采命令
emStatus = GXSendCommand(m_hDevice, GX_COMMAND_ACQUISITION_START);
//---------------------
//
//在这个区间图像会通过OnFrameCallbackFun接口返给用户
Sleep(100000);
//
//---------------------
//发送停采命令
emStatus = GXSendCommand(m_hDevice, GX_COMMAND_ACQUISITION_STOP);
//注销采集回调
emStatus = GXUnregisterCaptureCallback(m_hDevice);
if (m_pBufferRGB != NULL)
{
delete[]m_pBufferRGB;
m_pBufferRGB = NULL;
}
if (m_pBufferRaw != NULL)
{
delete[]m_pBufferRaw;
m_pBufferRaw = NULL;
}
emStatus = GXCloseDevice(m_hDevice);
emStatus = GXCloseLib();
return 0;
}
一般在工业设备上使用,需要进行监控及智能图像识别的点往往会多于一个,这时候这种使用网络进行数据传输的相机就显示出来优势了。
从大恒相机的开发手册上可以查到,函数调用:status = GXUpdateDeviceList(&nDeviceNum, 1000);返回的nDeviceNum就是当前网络上存在的相机数量。
随后可以使用相机的索引、序列号或者MAC地址方式来打开指定的相机。在网络环境简单的情况下,也可以使用IP地址打开指定相机,但通常这样会增加额外的设备安装时配置工作,所以并不建议。
//打开枚举列表中的第一台设备。
//假设枚举到了3台可用设备,那么用户可设置stOpenParam参数的pszContent字段为1、2、3
stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;
stOpenParam.openMode = GX_OPEN_INDEX;
stOpenParam.pszContent = "1";
//通过序列号打开设备
stOpenParam.openMode = GX_OPEN_SN;
stOpenParam.pszContent = "EA00010002";
//通过IP地址打开设备
//stOpenParam.openMode = GX_OPEN_IP;
//stOpenParam.pszContent = "192.168.40.35";
//通过MAC地址打开设备
//stOpenParam.openMode = GX_OPEN_MAC;
//stOpenParam.pszContent = "54-04-A6-C2-7C-2F";
//根据打开方式选择上面一种方式设置好参数后,可以使用下面函数打开相机
status = GXOpenDevice(&stOpenParam, &hDevice);
此外一个特别注意的小坑,SDK中提供了函数GXGetAllDeviceBaseInfo来遍历网络所有设备的信息,可以从其中查询相机的MAC地址、SN等各项信息。在实际工作中,可以使用这个函数获取相机信息后保存起来供以后打开相机使用,千万不能每次打开均使用此函数进行遍历查询,在一个网络设备较多的环境中,这个调用速度会非常慢,从而导致程序挂起。
大恒水晶相机_大恒工业相机多实例使用相关推荐
- 大数据 就业 缺口_大数据人才缺口大!乌兰察布从政策激励等方面吸引人才
授牌仪式 9月25日,记者从第八届内蒙古"草原英才"高层次人才合作交流会暨呼包鄂乌人才创新创业周乌兰察布分会场同步启动的2020年大数据产业发展与人才培养大会上获悉,乌兰察布市大数 ...
- Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:14:39 作者:陈飚 "昔我十年前,与君始相识." 一瞬间Hadoop也到了要 ...
- 大数据产业链结构_大数据产业链包含那几个应用环节?
大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产. 大数 ...
- python大数据就业方向_大数据方向:就业主要从事哪些工作?
你好. 一.大数据就业前景 大数据行业人才稀缺,人才需求量达100万+,随着人工智能.物联网.云计算的快速发展,大数据人才需求也急剧增加,未来还将不断扩大.而且大数据人才的薪资也是普遍较高的,2018 ...
- python大数据好不好学_大数据好学吗?想转行大数据??
作为一名IT从业者,同时也是一名教育工作者,我来回答一下这个问题. 首先,虽然大数据技术具有一定的难度,但是随着大数据技术体系的逐渐丰富和完善,大数据领域对于人才的需求类型也在不断趋于多元化,不同知识 ...
- python与大数据是什么_大数据和python有什么区别
大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才 能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化 ...
- python开发和大数据开发工程师_大数据开发工程师的岗位职责
大数据开发工程师负责该领域的业务需求讨论,完成技术方案及数据开发.下面是学习啦小编整理的大数据开发工程师的岗位职责. 大数据开发工程师的岗位职责1 职责: 1.负责所分管团队的团队建设和日常管理工作; ...
- hadloop大数据平台论文_大数据平台建设探讨
2019.03 1 概述 大数据平台通过统一的 大数据库实现全省业务信息 的集中 , 该库数据来源于全省各个业务系统和基础数据 库等应用数据 . 位置数据 . 搜索数据等结构化数据 . 半 结构化数据 ...
- 拼接大屏数据展示_大屏数据可视化设计注意事项
大屏数据可视化是以大屏为主要展示载体的数据可视化设计.大屏的特点,使得在用户观感上留下独特的印象,同时,大屏所具备储存更大的信息量,对于大屏企业来说重点主要在于将信息全面的显示在屏幕上,关注于画质的清 ...
最新文章
- Ivan Fedorov:用已知无法想象未来 - Mixin Network开发者访谈
- hdu 1280用hash解决。。
- 第4章 同余问题《信息学奥赛一本通 提高篇》
- DMA(2) S3C2410 DMA详解(其它的其实类似)
- 新加入一个团队,我们应该怎么做?
- 【Java小项目】简单的天气预报
- 牛顿法、梯度下降法原理及Python编程应用
- Java 框架、库和软件的精选列表(Awesome Java)
- 洛谷【入门4】数组 P2141 [NOIP2014 普及组] 珠心算测验
- 局部阈值matlab代码,matlab局部自适应阈值
- ❤️万字攻略,详解腾讯面试❤️
- 潍坊学院计算机系宿舍,关于表彰潍坊学院第十届大学生宿舍文化节先进集体和先进个人的决定...
- reactos操作系统实现(39)
- javascript 方法 一直提示 对象不支持此属性或方法
- 技术支撑团队技术支持工程师的技能要求
- 听秋夜虫鸣,与自己对话
- 默然日记20151123
- 大数据-玩转数据-MaxCompute 字符串函数
- 在测量面积的时候,为了精确一点,鼠标在操作面积测量时能拖动画面吗?
- 编程入门:如何正确认识编程?除了高薪,我再告诉你一些秘密!