前言:
近期企业需要用大恒相机的sdk开发项目,我采用VS2017+QT5.10.1+MSVC。

一、环境配置

VS2017和qt的安装不多介绍,主要介绍大恒sdk的配置。
1.https://www.daheng-image.com/list-58-1.html 官网下载大恒相机的SDK包,选择自己对应的相机
2.解压到自己的文件夹
文件目录如下:

3.c++文件的配置主要有头文件、库文件。
头文件在项目中的配置:
右击项目-属性-VC++目录-包含目录

路径为刚才解压的文件夹下路径

库目录路径:
右击项目-属性-VC++目录-库目录

路径为解压文件下路径

附加库依赖
右击项目-属性-链接器-输入

注意事项:有第三方库,将dll文件加入项目文件下即可。这样库文件配置完成开始编写代码部分。我用了opencv。

二、图像采集

 1.打开设备注意事项,必须先进行设备初始化 IGXFactory::GetInstance().Init();
//打开设备
void DH_MER::Open_Device()
{try{do{//初始化IGXFactory::GetInstance().Init();//枚举设备gxdeviceinfo_vector vectorDeviceInfo;IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);if (0 == vectorDeviceInfo.size()){cout << "无可用设备!" << endl;break;}cout << vectorDeviceInfo.size() << endl;//打开第一台设备以及设备下面第一个流ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);ObjStreamPtr = ObjDevicePtr->OpenStream(0);提高网络相机的采集性能,设置方法参考以下代码(目前只有千兆网系列相机支持设置最优包长)//GX_DEVICE_CLASS_LIST objDeviceClass =ObjDevicePtr->GetDeviceInfo().GetDeviceClass();//if (GX_DEVICE_CLASS_GEV == objDeviceClass)//{//    //判断设备是否支持流通道数据包功能//    if (true == ObjFeatureControlPtr->IsImplemented("GevSCPSPacketSize"))//  {//     //获取当前网络环境的最优包长值//      int nPacketSize = ObjStreamPtr->GetOptimalPacketSize();//       //将最优包长值设置为当前设备的流通道包长值//        ObjFeatureControlPtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize);//  }//}//注册设备掉线事件【目前只有千兆网系列相机支持此事件通知】pDeviceOfflineEventHandler = new CSampleDeviceOfflineEventHandler();hDeviceOffline = ObjDevicePtr->RegisterDeviceOfflineCallback(pDeviceOfflineEventHandler, NULL);//获取远端设备属性控制器ObjFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();
#ifdef _DEBUG//设置心跳超时时间 5minObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")->SetValue(5000);
#endiftxt_factoryName = ObjFeatureControlPtr->GetStringFeature("DeviceVendorName")->GetValue();txt_basicMode = ObjFeatureControlPtr->GetStringFeature("DeviceModelName")->GetValue();cout << "成功打开第一个设备" << endl;} while (0);}catch (CGalaxyException& e){cout << "错误码: " << e.GetErrorCode() << endl;cout << "错误描述信息: " << e.what() << endl;}catch (std::exception& e){cout << "错误描述信息: " << e.what() << endl;}
}
 2.采集图像
//采集图像
void DH_MER::Pick_Picture()
{//注册回调采集pCaptureEventHandler = new CSampleCaptureEventHandler();ObjStreamPtr->RegisterCaptureCallback(pCaptureEventHandler, this);//发送开采命令ObjStreamPtr->StartGrab();ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();
}
3.停止采集
//停止采集
void DH_MER::Stop_Picking()
{//发送停采命令ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();ObjStreamPtr->StopGrab();
}

4.采集图像事件处理
这里才是对采集的图像进行处理的地方

void CSampleCaptureEventHandler::DoOnImageCaptured(CImageDataPointer& objImageDataPointer, void* pUserParam)
{DH_MER* camUiPtr = (DH_MER*)pUserParam;cout << "收到一帧图像!" << endl;//cout << "ImageInfo: " << objImageDataPointer->GetPayloadSize() << endl;camUiPtr->txt_width = QString::number(objImageDataPointer->GetWidth());camUiPtr->txt_height = QString::number(objImageDataPointer->GetHeight());camUiPtr->captureImgMat.create(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC3);void* pRGB24Buffer = NULL;//假设原始数据是BayerRG8图像pRGB24Buffer = objImageDataPointer->ConvertToRGB24(GX_BIT_0_7, GX_RAW2RGB_NEIGHBOUR, true);memcpy(camUiPtr->captureImgMat.data, pRGB24Buffer, (objImageDataPointer->GetHeight()) * (objImageDataPointer->GetWidth()) * 3);//flip(img, img, 0);cout << "帧数:" << objImageDataPointer->GetFrameID() << endl;
}

5.相机线程调用实时采集

void WorkThread::run()
{unsigned char ret;if (1 == ThreadId){cancl->Open_Device();//打开设备cancl->Pick_Picture();//开始采集//if (CAM_RETURNVAL_NO_DEVICES == ret)//未找到摄像头设备//{//    return;//}}while (1){if (workcount)//关闭线程{cancl->Close_Device();workcount = false;break;}readFarme();QThread::usleep(33);}}
6.相机采集的图像进行算法处理
因算法不便公开,只写图片传出部分。
只需要用lable展示QPixmap即可ui->label_9->setPixmap(fitpixmap);
 //获取的到mat数据转换为image(mat为CV_8UC1)QImage image(cancl->captureImgMat.cols, cancl->captureImgMat.rows, QImage::Format_Indexed8);image.setColorCount(256);for (int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}uchar *pSrc = cancl->captureImgMat.data;for (int row = 0; row < cancl->captureImgMat.rows; row++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, cancl->captureImgMat.cols);pSrc += cancl->captureImgMat.step;}//获取摄像图像QPixmap pixmap = QPixmap::fromImage(image);emit UpdateImage(pixmap);//触发信号更新UI

三、相机类代码

 可以根据需求添加设备组和当前设备对象进行处理CameraClass.h
#pragma once
#include <opencv2/opencv.hpp>
#include"GalaxyIncludes.h"
#include<QObject>
using namespace cv;
using namespace std;
class CameraClass :public QObject
{Q_OBJECT
public:CameraClass();~CameraClass();//声明事件回调对象指针IDeviceOfflineEventHandler* pDeviceOfflineEventHandler = NULL;//掉线事件回调对象GX_DEVICE_OFFLINE_CALLBACK_HANDLE hDeviceOffline = NULL;//注册设备掉线IFeatureEventHandler* pFeatureEventHandler = NULL;//<远端设备事件回调对象ICaptureEventHandler* pCaptureEventHandler = NULL;//<采集回调对象CGXDevicePointer ObjDevicePtr;//设备指针CGXStreamPointer ObjStreamPtr;//流指针CGXFeatureControlPointer ObjFeatureControlPtr;//(远端)设备属性控制器指针Mat captureImgMat;//相机拍摄的图片QString choose_triggerMode;//选择触发模式QString txt_triggerSource;//触发源int txt_exposeTime;//曝光时间double txt_gain;//增益QString txt_width;//图像宽QString txt_height;//图像高QString txt_factoryName;//厂商QString txt_basicMode;
public:void Open_Device();//open the devicevoid Close_Device();//close the devicevoid Pick_Picture();//start picking the picturevoid Stop_Picking();//stop picking the picture};
class CSampleCaptureEventHandler : public ICaptureEventHandler
{public:void DoOnImageCaptured(CImageDataPointer& objImageDataPointer, void* pUserParam);
};//用户继承掉线事件处理类
class CSampleDeviceOfflineEventHandler : public IDeviceOfflineEventHandler
{public:void DoOnDeviceOfflineEvent(void* pUserParam){cout << "收到设备掉线事件!" << endl;}
};

CameraClass.cpp

#include "CameraClass.h"CameraClass::CameraClass()
{}CameraClass::~CameraClass()
{}
//打开设备
void CameraClass::Open_Device()
{try{do{//初始化IGXFactory::GetInstance().Init();//枚举设备gxdeviceinfo_vector vectorDeviceInfo;IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);if (0 == vectorDeviceInfo.size()){cout << "无可用设备!" << endl;break;}cout << vectorDeviceInfo.size() << endl;//打开第一台设备以及设备下面第一个流ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);ObjStreamPtr = ObjDevicePtr->OpenStream(0);提高网络相机的采集性能,设置方法参考以下代码(目前只有千兆网系列相机支持设置最优包长)//GX_DEVICE_CLASS_LIST objDeviceClass =ObjDevicePtr->GetDeviceInfo().GetDeviceClass();//if (GX_DEVICE_CLASS_GEV == objDeviceClass)//{//    //判断设备是否支持流通道数据包功能//    if (true == ObjFeatureControlPtr->IsImplemented("GevSCPSPacketSize"))//  {//     //获取当前网络环境的最优包长值//      int nPacketSize = ObjStreamPtr->GetOptimalPacketSize();//       //将最优包长值设置为当前设备的流通道包长值//        ObjFeatureControlPtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize);//  }//}//注册设备掉线事件【目前只有千兆网系列相机支持此事件通知】pDeviceOfflineEventHandler = new CSampleDeviceOfflineEventHandler();hDeviceOffline = ObjDevicePtr->RegisterDeviceOfflineCallback(pDeviceOfflineEventHandler, NULL);//获取远端设备属性控制器ObjFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();
#ifdef _DEBUG//设置心跳超时时间 5minObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")->SetValue(5000);
#endiftxt_factoryName = ObjFeatureControlPtr->GetStringFeature("DeviceVendorName")->GetValue();txt_basicMode = ObjFeatureControlPtr->GetStringFeature("DeviceModelName")->GetValue();cout << "成功打开第一个设备" << endl;} while (0);}catch (CGalaxyException& e){cout << "错误码: " << e.GetErrorCode() << endl;cout << "错误描述信息: " << e.what() << endl;}catch (std::exception& e){cout << "错误描述信息: " << e.what() << endl;}
}
//关闭设备
void CameraClass::Close_Device()
{try{Stop_Picking();//注销采集回调ObjStreamPtr->UnregisterCaptureCallback();注销远端设备事件//ObjFeatureControlPtr->UnregisterFeatureCallback(hFeatureEvent);//注销设备掉线事件ObjDevicePtr->UnregisterDeviceOfflineCallback(hDeviceOffline);//释放资源ObjStreamPtr->Close();ObjDevicePtr->Close();//反初始化库IGXFactory::GetInstance().Uninit();//销毁事件回调指针if (NULL != pCaptureEventHandler){delete pCaptureEventHandler;pCaptureEventHandler = NULL;}if (NULL != pDeviceOfflineEventHandler){delete pDeviceOfflineEventHandler;pDeviceOfflineEventHandler = NULL;}if (NULL != pFeatureEventHandler){delete pFeatureEventHandler;pFeatureEventHandler = NULL;}cout << "关闭设备" << endl;}catch (const std::exception&){}}
//采集图像
void CameraClass::Pick_Picture()
{//注册回调采集pCaptureEventHandler = new CSampleCaptureEventHandler();ObjStreamPtr->RegisterCaptureCallback(pCaptureEventHandler, this);//发送开采命令ObjStreamPtr->StartGrab();ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();
}
//停止采集
void CameraClass::Stop_Picking()
{//发送停采命令ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();ObjStreamPtr->StopGrab();
}
void CSampleCaptureEventHandler::DoOnImageCaptured(CImageDataPointer& objImageDataPointer, void* pUserParam)
{CameraClass* camUiPtr = (CameraClass*)pUserParam;cout << "收到一帧图像!" << endl;//cout << "ImageInfo: " << objImageDataPointer->GetPayloadSize() << endl;camUiPtr->txt_width = QString::number(objImageDataPointer->GetWidth());camUiPtr->txt_height = QString::number(objImageDataPointer->GetHeight());camUiPtr->captureImgMat.create(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC3);void* pRGB24Buffer = NULL;//假设原始数据是BayerRG8图像pRGB24Buffer = objImageDataPointer->ConvertToRGB24(GX_BIT_0_7, GX_RAW2RGB_NEIGHBOUR, true);memcpy(camUiPtr->captureImgMat.data, pRGB24Buffer, (objImageDataPointer->GetHeight()) * (objImageDataPointer->GetWidth()) * 3);//flip(img, img, 0);cout << "帧数:" << objImageDataPointer->GetFrameID() << endl;
}

四、效果展示


实际效果不错,可以看文档更改相机设置。
喜欢点个关注吧

VS调用大恒相机sdk实时显示图像并进行图像处理+OPENCV相关推荐

  1. QT调用大恒相机的开发教程

    Qt(5.12.10) 调用大恒相机,实时显示图像,并保存bmp文件 文章导读:相机为大恒相机,接口是USB3.0,水星系列产品.本项目采用Qt5.12.10版本编码,编译器为MSVC2017,ope ...

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

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

  3. 在Ubuntu中用Qt基于OpenCV调用大恒相机

    在Ubuntu中用Qt基于OpenCV调用大恒相机 前言 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了.刚开始自己摸索,碰到好多问题解决不了,Qt报错不知道咋回事,缺少的链 ...

  4. C#调用大华相机SDK获取图片,转换成VisionPro的Icogimage格式

    文章讲的是C#调用大华相机SDK,通过回调事件获取图片并转换成visionpro的Icogimage格式,文章底部会分享例程.在调用SDK之前,需要先安装大华的相机软件到C盘,不安装到C盘会显示依赖项 ...

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

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

  6. Python调用大恒相机采集图片(Ubuntu16.04)

    Python调用大恒相机(Ubuntu16.04) 文章目录 Python调用大恒相机(Ubuntu16.04) 下载API文件 环境配置 验证 采集图片 下载API文件 wget http://gb ...

  7. Qt Creator 添加大恒相机SDK库

    记录开发大恒相机遇到的问题 拷贝大恒SDK(D:\GalaxySDK\Samples\C++ SDK)的inc.lib相应文件到项目文件夹 首先:添加动态链接库lib 方法一(简单) 不需要在.pro ...

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

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

  9. Unity调用大华相机SDK采集图像及基本功能设定

    unity平台对视频播放不是很友好,而大华的SDK只有c#版本的并没有专门为unity做出来SDK,最开始尝试过使用SDK里面的方式获取YUV格式的视频流,再讲YUV格式的视频流转换为unity可以播 ...

最新文章

  1. python 点的投影变换
  2. 扫盲!Java可变长数组,看这篇就对了!
  3. python-函数-默认值传参
  4. 怎么将layui导入php中,layui怎么导入Excel
  5. C#中MySQL数据库的备份 还原 初始化
  6. bzoj 3374: [Usaco2004 Mar]Special Serial Numbers 特殊编号
  7. Latex中的常用公式模板
  8. mybatis---知识点复习
  9. System 中的数学函数
  10. python做一个qq聊天窗口_python实现qq聊天(带界面)
  11. eighth week(1)
  12. GhostNet网络详解
  13. 携程PMO出品 | 浅谈OKR- 什么是OKR?
  14. 【CSS】纯css实现立体摆放图片效果
  15. C# 汉字转拼音 拼音转汉字 简体繁体互转
  16. Autoconf解释
  17. 深入了解Linux内核MMU管理机制
  18. TimescaleDB的结构初识
  19. 计算机专业英语词组,(计算机专业英语词组.doc
  20. Excel教程:规范Excel表格设计,让工作效率提升百倍不止

热门文章

  1. 开源LLM领域变天!LLaMa惊天泄露引爆ChatGPT平替狂潮
  2. 生活模拟像素游戏地图农场钓鱼伐木Gamemaker Studio tiled素材
  3. 给一个不多于5位的正整数,要求: 1.求出它是几位数; 2.分别输出每一位数字; 3.按逆序输出各位数字;
  4. 把PDF转换成PPT有哪些方法
  5. 解决 zbrush导出的模型在blender里没有颜色的问题
  6. 轻松一下:python(turtle模块)绘制分形图
  7. 权限管理AppOps
  8. 关于定位一直在香港的解决方式
  9. linux系统能做什么的,Linux系统适合日常使用吗?普通人学Linux能干什么
  10. ubuntu20 从wine安装到微信3的使用(解决微信乱码、无法输入)