目录

第一步:安装Gaalxy_view软件:Galaxy_V18.06.25.01_X86_Win_cn.exe

第二步:测试相机:MER-1070-10GC相机,应用软件打开该相机体验。

第三步:利用SDK-API进行编程,主要功能(开启、采集、录像、停止、关闭)

C接口

利用回调函数进行显示

C++ 接口

利用回调函数进行显示

利用获取帧进行显示

第四步:MFC联合SDK进行项目开发(当前项目瓷砖检测)。


第一步:安装Gaalxy_view软件:Galaxy_V18.06.25.01_X86_Win_cn.exe

软件从官网-技术支持-下载中心-选择需求软件(可单独使用SDK包、本文使用SDK+客户端软件一体)

链接:https://pan.baidu.com/s/1Il2qr_LD8Zz8gpb0QNQBaw 提取码:kh2w

         

第二步:测试相机:MER-1070-10GC相机,应用软件打开该相机体验。

MER-1070-10GC相机为以太网通信的相机,之前开发的项目都是走FlyCapture的sdk,不能开启该相机,所有先测试体验下。

第三步:利用SDK-API进行编程,主要功能(开启、采集、录像、停止、关闭)

重中之重,如何开发所需功能,鄙人使用联合Opencv图像库联合开发。

使用C接口和C++ 接口两个程序分别实现:

总体思路:

初始化接口库——》枚举设备——》打开设备打开流

——》注册设备掉线事件【目前只有千兆网系列相机支持此事件通知】

——》获取远端设备属性控制器

————》注册远端设备事件【属性控制器】

——》注册回调采集(显示)

————》发送开采命令【属性控制器】

————》发送停采命令【属性控制器】

——》注销采集回调

——》注销远端设备事件

——》注销设备掉线事件

——》释放资源

C接口

(参考网上代码,C++的是看接口说明文档进行的)

配置:VC SDK的inc和lib、Opencv SDK配置

利用回调函数进行显示

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <GxIAPI.h>
#include <DxImageProc.h>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 <m_nImageHeight; 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;
}

C++ 接口

CCD采集的像素,该相机的图形格式GX_PIXEL_FORMAT_BAYER_GR8:Bayer Green-Red 8-bit

必备:https://blog.csdn.net/joe9280/article/details/46952947

条件:C++SDK配置、Opencv SDK配置

利用回调函数进行显示

# 实时显示——使用Mat Opencv
#include"stdafx.h"
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;//请用户提前配置好工程头文件目录,需要包含GalaxyIncludes.h
#include"GalaxyIncludes.h"//用户继承掉线事件处理类
class CSampleDeviceOfflineEventHandler : public IDeviceOfflineEventHandler
{
public:void DoOnDeviceOfflineEvent(void* pUserParam){cout << "收到设备掉线事件!" << endl;}
};//用户继承属性更新事件处理类
class CSampleFeatureEventHandler : public IFeatureEventHandler
{
public:void DoOnFeatureEvent(const GxIAPICPP::gxstring&strFeatureName, void* pUserParam){cout << "收到曝光结束事件!" << endl;}
};//用户继承采集事件处理类
class CSampleCaptureEventHandler : public ICaptureEventHandler
{
public:void DoOnImageCaptured(CImageDataPointer&objImageDataPointer, void* pUserParam){cout << "收到一帧图像!" << endl;cout << "ImageInfo: " << objImageDataPointer->GetStatus() << endl;cout << "ImageInfo: " << objImageDataPointer->GetWidth() << endl;cout << "ImageInfo: " << objImageDataPointer->GetHeight() << endl;cout << "ImageInfo: " << objImageDataPointer->GetPayloadSize() << endl;cout << objImageDataPointer->GetPixelFormat() << endl;cout << GX_PIXEL_FORMAT_BAYER_GR8 << endl;void* pRGB24Buffer = NULL;//假设原始数据是BayerRG8图像pRGB24Buffer = objImageDataPointer->ConvertToRGB24(GX_BIT_0_7, GX_RAW2RGB_NEIGHBOUR, true);Mat test;test.create(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC3);memcpy(test.data, pRGB24Buffer, objImageDataPointer->GetPayloadSize() * 3);namedWindow("测试", 0);imshow("测试", test);waitKey(10);}
};int _tmain(int argc, _TCHAR* argv[])
{//声明事件回调对象指针IDeviceOfflineEventHandler* pDeviceOfflineEventHandler = NULL;///<掉线事件回调对象IFeatureEventHandler* pFeatureEventHandler = NULL;///<远端设备事件回调对象ICaptureEventHandler* pCaptureEventHandler = NULL;///<采集回调对象//初始化IGXFactory::GetInstance().Init();try{do{//枚举设备gxdeviceinfo_vector vectorDeviceInfo;IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);if (0 == vectorDeviceInfo.size()){cout << "无可用设备!" << endl;break;}//打开第一台设备以及设备下面第一个流CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);CGXStreamPointer ObjStreamPtr = ObjDevicePtr->OpenStream(0);//注册设备掉线事件【目前只有千兆网系列相机支持此事件通知】GX_DEVICE_OFFLINE_CALLBACK_HANDLE hDeviceOffline = NULL;pDeviceOfflineEventHandler = new CSampleDeviceOfflineEventHandler();hDeviceOffline = ObjDevicePtr->RegisterDeviceOfflineCallback(pDeviceOfflineEventHandler, NULL);//获取远端设备属性控制器CGXFeatureControlPointer ObjFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();//设置曝光时间(示例中写死us,只是示例,并不代表真正可工作参数,可以尝试,但是不要乱用)//ObjFeatureControlPtr->GetFloatFeature("ExposureTime")->SetValue(500);//注册远端设备事件:曝光结束事件【目前只有千兆网系列相机支持曝光结束事件】//选择事件源ObjFeatureControlPtr->GetEnumFeature("EventSelector")->SetValue("ExposureEnd");//使能事件ObjFeatureControlPtr->GetEnumFeature("EventNotification")->SetValue("On");GX_FEATURE_CALLBACK_HANDLE hFeatureEvent = NULL;pFeatureEventHandler = new CSampleFeatureEventHandler();hFeatureEvent = ObjFeatureControlPtr->RegisterFeatureCallback("EventExposureEnd",pFeatureEventHandler,NULL);//注册回调采集pCaptureEventHandler = new CSampleCaptureEventHandler();ObjStreamPtr->RegisterCaptureCallback(pCaptureEventHandler, NULL);//发送开采命令ObjStreamPtr->StartGrab();ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();//此时开采成功,控制台打印信息,直到输入任意键继续getchar();//发送停采命令ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();ObjStreamPtr->StopGrab();//注销采集回调ObjStreamPtr->UnregisterCaptureCallback();//注销远端设备事件ObjFeatureControlPtr->UnregisterFeatureCallback(hFeatureEvent);//注销设备掉线事件ObjDevicePtr->UnregisterDeviceOfflineCallback(hDeviceOffline);           //释放资源ObjStreamPtr->Close();ObjDevicePtr->Close();} while (0);}catch (CGalaxyException&e){cout << "错误码: " << e.GetErrorCode() << endl;cout << "错误描述信息: " << e.what() << endl;}catch (std::exception&e){cout << "错误描述信息: " << e.what() << endl;}//反初始化库IGXFactory::GetInstance().Uninit();//销毁事件回调指针if (NULL != pCaptureEventHandler){delete pCaptureEventHandler;pCaptureEventHandler = NULL;}if (NULL != pDeviceOfflineEventHandler){delete pDeviceOfflineEventHandler;pDeviceOfflineEventHandler = NULL;}if (NULL != pFeatureEventHandler){delete pFeatureEventHandler;pFeatureEventHandler = NULL;}return 0;
}

利用获取帧进行显示

条件:C++SDK配置、Opencv SDK配置

#include"stdafx.h"
#include<iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;//请用户提前配置好工程头文件目录,需要包含GalaxyIncludes.h
#include"GalaxyIncludes.h"Mat src;int _tmain(int argc, _TCHAR* argv[])
{//初始化IGXFactory::GetInstance().Init();try{do{//枚举设备gxdeviceinfo_vector vectorDeviceInfo;IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);if (0 == vectorDeviceInfo.size()){cout << "无可用设备!" << endl;break;}//打开第一台设备以及设备下面第一个流CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);                        CGXStreamPointer ObjStreamPtr = ObjDevicePtr->OpenStream(0);//获取远端设备属性控制器CGXFeatureControlPointer ObjFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();//发送开采命令ObjStreamPtr->StartGrab();ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();           //主程序       //采单帧int a = 1;while (a){CImageDataPointer objImageDataPtr;                objImageDataPtr = ObjStreamPtr->GetImage(500);//超时时间使用500ms,用户可以自行设定if (objImageDataPtr->GetStatus() == GX_FRAME_STATUS_SUCCESS){//getchar();//采图成功而且是完整帧,可以进行图像处理...cout << "收到一帧图像!" << endl;cout << "ImageInfo: " << objImageDataPtr->GetStatus() << endl;cout << "ImageInfo: " << objImageDataPtr->GetWidth() << endl;cout << "ImageInfo: " << objImageDataPtr->GetHeight() << endl;cout << "ImageInfo: " << objImageDataPtr->GetPayloadSize() << endl;cout << objImageDataPtr->GetPixelFormat() << endl;cout << GX_PIXEL_FORMAT_BAYER_GR8 << endl;//假设原始数据是BayerRG8图像,则 GX_BIT_0_7void* pRGB24Buffer = NULL;               pRGB24Buffer = objImageDataPtr->ConvertToRGB24(GX_BIT_0_7, GX_RAW2RGB_NEIGHBOUR, true);             Mat test;test.create(objImageDataPtr->GetHeight(), objImageDataPtr->GetWidth(), CV_8UC3);memcpy(test.data, pRGB24Buffer, objImageDataPtr->GetPayloadSize() * 3);namedWindow("测试", 0);imshow("测试", test);//waitKey(10);test.copyTo(src);//system("pause");if (waitKey(20)==27){a = 0;break;}}}//发送停采命令ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();ObjStreamPtr->StopGrab();//释放资源ObjStreamPtr->Close();ObjDevicePtr->Close();} while (false);}catch (CGalaxyException&e){cout << "错误码: " << e.GetErrorCode() << endl;cout << "错误描述信息: " << e.what() << endl;}catch (std::exception&e){cout << "错误描述信息: " << e.what() << endl;}//反初始化库IGXFactory::GetInstance().Uninit();return 0;
}

问题解决:

问题一【图示】:该问题为库的配置没有连接好,解决方案:查看配置(ilb、inc、dll)的文件缺省,检测完成,重启电脑。

问题二【图示】:图片流转Mat的问题

问题三【运行一次正常,如果手动中断程序,则不能再次访问相机】:

只能重启相机电源,因为该相机没有自动清除网络占有

第四步:MFC联合SDK进行项目开发之一(MFC相机界面)

机器视觉_相机开发(二)——大恒相机相关推荐

  1. 相机PHP,C/C++、C#、PHP相机开发实例 大恒相机SDK

    [实例简介]C/C .C#.PHP相机开发实例 大恒相机SDK [实例截图] [核心代码] public  class GxBitmap { IGXDevice      m_objIGXDevice ...

  2. 大恒相机开发(大恒SDK+opencv开发)笔记1

    大恒相机开发(大恒SDK+opencv开发 一.项目简介 在大三上学期做过人脸识别的开发,刚好下学期老师手中有相机的项目,然后项目就到了我手上,下面是我开发这个项目的一些经历,进程还在调试中.笔记会按 ...

  3. aforge 相机标定_CSharp 大恒相机采集单帧图像的C#程序, 易懂,供大家参考 assembly language 汇编语言 252万源代码下载- www.pudn.com...

    文件名称: CSharp下载  收藏√  [ 5  4  3  2  1 ] 开发工具: C# 文件大小: 5558 KB 上传时间: 2016-02-27 下载次数: 0 详细说明:大恒相机采集单帧 ...

  4. 基于大恒相机SDK,二次开发

    基于大恒相机SDK,二次开发(C#) 界面如下 有曝光.增益两个参数可以调整(平台是X64) 有问题可以问 看到就回答 using System; using System.Collections.G ...

  5. 大恒相机sdk二次开发 _c#从0开始新建winform窗体实现相机基础采集功能

    1.打开VS, 这里安装的是VS2019, 新建winform窗体. 2.打开水星驱动安装目录下的例程作为参考. 水星驱动安装包可以在大恒图像官网下载最新版本, 安装目录不要有中文路径, 安装之前把杀 ...

  6. 大恒相机Python版Qt界面(二)

    书接上回:大恒相机Python版Qt界面(一)_△ф的博客-CSDN博客_python大恒.目前,基于PyQt5的大恒相机UI界面开发已基本完成,总体界面如下: 该UI界面中,主要包括了相机使用中的几 ...

  7. 大恒相机开发问题(错误码: -8)无法打开相机

    前言: 记录一下大恒相机开发中的问题,如果能给和我一样正在摸索的小白一些帮助就更好了. 一.问题: 错误码: -8 错误描述信息: {Accessdenied:{1005}{GenICam::Clie ...

  8. vs+Qt+opencv+大恒相机开发(基础功能,适合初学者学习)

    注:代码仅供参考,相互学习. 本意:帮助大家快速入手大恒相机,也留个记录后续优化. 配置环境:VS2019.OpenCV454.Qt5.14.2.大恒水星系列相机(gige) 优化: 2022/4/2 ...

  9. 大恒相机开发实践(1)——实时采图

    目录 前言 正文 准备工作 设备的初始化 设备信息的获取 实时采图 将采集到的Buffer传上显示层 总结 前言 本篇博客稍微记录一下我所写的插件.具体内容是有关于大恒相机的,关于这个相机,相信搜索到 ...

  10. 大恒相机开发实践(3)——参数设置

    目录 前言 正文 初始化配置信息 创建Xml节点 创建节点下面的Attribute 总结 前言 这一部分的内容放在如何生成大恒相机的参数,但其实难点并不在我接下去写的部分.难点在于你获得了这个节点的N ...

最新文章

  1. 联想拯救者y空间兑换代码_十代酷睿全面升级 拯救者Y7000P 2020产品解读
  2. python不支持_为什么 Python 不支持函数重载?而其他语言大都支持?
  3. springMVC——Xml配置方式实现Helloworld
  4. git 使用及常用命令介绍
  5. Hadoop RPC框架
  6. [转载] Java中对象数组的使用
  7. 使用新的 apt 命令在 Ubuntu 16.04 LTS 下管理软件包
  8. 用了这么久,你真的真的明白 HttpClient 的实现原理了吗?
  9. html5实现视频播放器 弹幕效果,基于HTML5的有弹幕功能的视频播放器
  10. 执行计划:SET AUTOTRACE TRACEONLY
  11. 《UNIX操作系统》学习笔记
  12. 甘肃暴雨强度公式_我国若干城暴雨强度公式列表.doc
  13. 《穿越计算机的迷雾》
  14. 微信小程序——仿写京东购物商城带源码
  15. python课程结课感悟_python听课的感悟与建议
  16. 员工接私单可不可以追究刑事责任
  17. webkit未能加载文件或程序集WebKitBrowser
  18. 嵌入式开发学习路线图
  19. C++ vector 标准差
  20. CCS编译优化与volatile

热门文章

  1. java键盘监听延迟_解决JAVA键盘监听的延迟现象以及八个方向的运动
  2. siggraph_Siggraph的统一性
  3. python后端开发简历分享_Python后端开发工程师面试
  4. 在iPhone上使用3D Touch
  5. 多商家入驻分销平台基本功能设计
  6. 微信小程序入门-指南针
  7. openCV绘制简单Sierpinski(分形)图形
  8. 基于python的网贷平台Prosper数据分析
  9. http://strong0511.blog.163.com/blog/static/15115379520124510362211/
  10. zipfile — 访问 ZIP 压缩文件