opencv读取大恒相机
大恒相机真的是坑,如果你想连续保存保存图像基本会蓝屏,至于原因我还在找,感觉它的sdk做的不是很人性化,怎么说呢,用opencv读图像一点问题没有,显示也没有,但是想要连续保存就会蓝屏,真的不是很懂。
我用的代码几乎就是sdk里面doc文档的c++,但是怎么用opencv来读取图像呢,需要用到memcpy这个内存拷贝函数,代码如下
Mat curr(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC1);
void* pRaw8Buffer = NULL;
pRaw8Buffer = objImageDataPointer->ConvertToRaw8(GX_BIT_0_7);
memcpy(curr.data, pRaw8Buffer, (objImageDataPointer->GetHeight())*(objImageDataPointer->GetWidth()));
flip(curr, curr, 0);
这样就可以将存储数据转到mat上了,然后就可以显示了。但是想要连续保存,我用imwrite进行连续保存在关闭终端会蓝屏。。。难受啊。。。
好了,下面给出代码,基本参考它的工程示例
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include "stdlib.h"
#include <fstream>
using namespace std;
using namespace cv;
int j = 0;
//请用户提前配置好工程头文件目录,需要包含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;Mat curr(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC1);void* pRaw8Buffer = NULL;pRaw8Buffer = objImageDataPointer->ConvertToRaw8(GX_BIT_0_7);memcpy(curr.data, pRaw8Buffer, (objImageDataPointer->GetHeight())*(objImageDataPointer->GetWidth()));flip(curr, curr, 0);j++;char st[30];sprintf_s(st, 30, "%s%d%s", "./photo/", j, ".bmp");imwrite(st, curr);imshow("h", curr);waitKey(1);cout << "zhenshu" << objImageDataPointer->GetFrameID() << endl;}
};int main(int argc, char* argv[])
{//声明事件回调对象指针IDeviceOfflineEventHandler* pDeviceOfflineEventHandler = NULL;///<掉线事件回调对象IFeatureEventHandler* pFeatureEventHandler = NULL;///<远端设备事件回调对象ICaptureEventHandler* pCaptureEventHandler = NULL;///<采集回调对象
//初始化IGXFactory::GetInstance().Init();for (int i = 0;i<1; i++){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();//注册远端设备事件:曝光结束事件【目前只有千兆网系列相机支持曝光结束事件】//选择事件源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();}//反初始化库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;
}
我这个是连续保存多张,但是会蓝屏,直接将imwrite函数删了就不会了。。。
最后吐槽一下,国产相机的sdk开发都比较麻烦,但是便宜,只不过国外的相机直接插上就能用还是很不错的。。。
然后呢,我现在采用调用单帧采集循环来实现采集功能,这样就不会担心因为内存泄露而崩溃啦,真的很奇怪,大恒自己的回调采集居然会和opencv有这么强的不兼容。。。
//博主一天后归来
经过看代码,发现其实是博主自己的问题,代码在进行回调采集后面有一个getchar()函数,用来等待我们进行输入字符来使程序进行向下执行从而跳出回调采集,所以一般只要在终端输入回车就ok了。。
//博主zz。。。
下面给出通过重复循环单帧来达到采集功能
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include "stdlib.h"
#include <fstream>
using namespace std;
using namespace cv;//请用户提前配置好工程头文件目录,需要包含GalaxyIncludes.h
#include <GalaxyIncludes.h>int main()
{IGXFactory::GetInstance().Init();//枚举设备GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);if (vectorDeviceInfo.size() > 0){//打开设备CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);CGXStreamPointer ObjStreamPtr = ObjDevicePtr->OpenStream(0);//开启流通道采集ObjStreamPtr->StartGrab();//给设备发送开采命令CGXFeatureControlPointer objFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();objFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();//并不需要用到此循环其实。。。它回调采集内部就是已经做成循环了for (int i = 0; i < 5; i++){//采单帧CImageDataPointer objImageDataPtr;objImageDataPtr = ObjStreamPtr->GetImage(500);//超时时间使用500ms,用户可以自行设定if (objImageDataPtr->GetStatus() == GX_FRAME_STATUS_SUCCESS){//采图成功而且是完整帧,可以进行图像处理...cout << "收到一帧图像!" << endl;cout << "ImageInfo: " << objImageDataPtr->GetStatus() << endl;cout << "ImageInfo: " << objImageDataPtr->GetWidth() << endl;cout << "ImageInfo: " << objImageDataPtr->GetHeight() << endl;cout << "ImageInfo: " << objImageDataPtr->GetPayloadSize() << endl;void* pRaw8Buffer = NULL;//假设原始数据是Mono8图像pRaw8Buffer = objImageDataPtr->ConvertToRaw8(GX_BIT_0_7);Mat curr(objImageDataPtr->GetHeight(), objImageDataPtr->GetWidth(), CV_8UC1);memcpy(curr.data, pRaw8Buffer, (objImageDataPtr->GetHeight())*(objImageDataPtr->GetWidth()));char st[30];sprintf_s(st, 30, "%s%d%s", "./photo/", i, ".bmp");imwrite(st, curr);waitKey(15);}}//停采objFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();ObjStreamPtr->StopGrab();//关闭流通道ObjStreamPtr->Close();}IGXFactory::GetInstance().Uninit();system("pause");return 0;
}
好啦,这样就可以愉快的利用工业级相机来进行图像处理并且连续保存了,现在的感受是,便宜还是便宜的好,只不过开发sdk比较吃力,毕竟这么便宜的工业相机还是可以的嘛,支持一下国产吼吼吼。。。恩。。。真香。
最后总结,还是一句话,sdk写的其实很完善,文档一定要好好看。。。
opencv读取大恒相机相关推荐
- 在Ubuntu中用Qt基于OpenCV调用大恒相机
在Ubuntu中用Qt基于OpenCV调用大恒相机 前言 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了.刚开始自己摸索,碰到好多问题解决不了,Qt报错不知道咋回事,缺少的链 ...
- VS2010读取大恒相机图像并显示
1.首先去大恒官网安装软件 安装完成后有以下文件夹 2.配置VS2010的环境 3.编写C++代码 #include <iostream> #include <fstream> ...
- vs+Qt+opencv+大恒相机开发(基础功能,适合初学者学习)
注:代码仅供参考,相互学习. 本意:帮助大家快速入手大恒相机,也留个记录后续优化. 配置环境:VS2019.OpenCV454.Qt5.14.2.大恒水星系列相机(gige) 优化: 2022/4/2 ...
- VS调用大恒相机sdk实时显示图像并进行图像处理+OPENCV
前言: 近期企业需要用大恒相机的sdk开发项目,我采用VS2017+QT5.10.1+MSVC. 一.环境配置 VS2017和qt的安装不多介绍,主要介绍大恒sdk的配置. 1.https://www ...
- Qt+大恒相机+OpenCV+MinGW界面开发
Qt+大恒相机+OpenCV+MinGW界面开发 遇到的坑有哪些? 大恒相机接口的问题(C与C++选谁,傻傻分不清) OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出) ...
- 大恒相机开发(大恒SDK+opencv开发)笔记1
大恒相机开发(大恒SDK+opencv开发 一.项目简介 在大三上学期做过人脸识别的开发,刚好下学期老师手中有相机的项目,然后项目就到了我手上,下面是我开发这个项目的一些经历,进程还在调试中.笔记会按 ...
- 【OpenCV】用OpenCV进行大恒CG400CG410视频采集卡的视频读取
用OpenCV进行大恒CG400CG410视频采集卡的视频读取 (2013-04-27 16:12:02) 分类: opencv 最近用到红外摄像头,要用到视频采集卡,采用的是大恒CG410的板子, ...
- ubuntu系统配置大恒相机驱动并读取ros话题
文章目录 0. 说明 1. 安装大恒相机sdk 1.1 下载 1.2 安装sdk(用于配置ip和调试相机参数) (1) 电脑网卡配置(网卡固定ip) (2)查看相机图像以及配置相机参数 2. 安装ro ...
- QT调用大恒相机的开发教程
Qt(5.12.10) 调用大恒相机,实时显示图像,并保存bmp文件 文章导读:相机为大恒相机,接口是USB3.0,水星系列产品.本项目采用Qt5.12.10版本编码,编译器为MSVC2017,ope ...
最新文章
- PHP的.htaccess
- python--装饰器(附偏函数、断言)
- Ubuntu12.04安装小记
- BGP小实验(一)——小实验练练手走起来
- mongdb学习笔记
- pythontry参数_Python ——Try Except
- vue html引入图片,vue引入图片的几种方式
- python open方法1001python open方法_怎样才能写出 Pythonic 的代码 #P1001#
- intelRealsense D435 python读取并显示彩图和深度图
- Java自动化测试框架-07 - TestNG之Factory篇 - (详细教程)
- srgan要训练多久_儿童内裤多久换一次,穿多久要扔掉?
- SQLiteDev与.NET日期格式,该字符串未被识别为有效的 DateTime
- wangEditor-v5使用
- c3p0连接池配置模板,SSM中使用c3p0连接池配置属性
- Python:监控键盘输入、鼠标操作,并将捕获到的信息记录到文件中 (转)
- 日期比较(substring split prase)
- 计算机行业常见英语,计算机行业英文词汇
- 山寨美图秀秀的美肤功能----实现过程
- 华为云 CDN金秋特惠活动,这价可以
- 又涨了!2021 年 5 月程序员工资统计新鲜出炉,网友:还是Java程序员牛逼~