精华内容
下载资源
问答
  • OpenCV+大恒相机

    2018-05-20 15:10:12
    使用OpenCV函数打开大恒GV400UC相机,MFC界面设计、简单易懂
  • QT+OpenCV调用大恒相机进行实时采集和单帧采集,包括Ui设计等,需要提前配置好大恒SDK,网上有教程。
  • opencv读取大恒相机

    千次阅读 2019-01-05 11:50:09
    大恒相机真的是坑,如果你想连续保存保存图像基本会蓝屏,至于原因我还在找,感觉它的sdk做的不是很人性化,怎么说呢,用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相机(单)调用大恒水星相机,适宜版本是opencv2.xx
  • 在Ubuntu中用Qt基于OpenCV调用大恒相机前言一、在Ubuntu中安装大恒相机驱动二、Qt中设置环境 前言 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了。刚开始自己摸索,碰到好多问题解决...

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

    前言

    • 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了。刚开始自己摸索,碰到好多问题解决不了,Qt报错不知道咋回事,缺少的链接库一下载就是无法固定软件位置,还以为自己的系统有问题。
    • 还好买相机时商家给了相机使用方法的相关文件,在我几乎绝望的时候,硬是把相关文件全部翻了一遍,才搞明白到底咋用。在安装好相机驱动后的文件夹中有详细的教程,还有相关例程。
    • 我针对自己的配置过程进行了步骤总结,请大家按需所取吧。
    • 由于自己不认真看人家的资料,浪费了好长时间,网上的相关教程又很少。于是我就编写了这篇文章,分享自己的经历,让更多的人少走弯路,我觉得很有意义。

    前提:已经安装并配置好了OpenCV和Qt,且写好了调用相机的源文件

    一、在Ubuntu中安装大恒相机驱动

    1. 首先打开商家给的文件夹,将相机驱动安装包解压后移动到ubuntu中
      文件名:DAHENG_GigE_USB3_Linux_X86_20181107_CN-EN.tar
      (压缩包中的readme.txt有安装步骤 英文版)

      在这里插入图片描述

    2. 以管理员身份为安装包文件添加所有读写操作

    	su root
    	密码:
    	chmod 777 xxx.bin
    
    1. 运行安装包
    	./xxx.bin
    
    • 安装脚本会自动在/usr/local/下创建工作目录,并在/usr/lib/下创建动态库的链接文件。

    • 安装脚本自动注册GENICAM_ROOT_V2_3、LD_LIBRARY_PATH、GENICAM_GENTLxx_PATH、GENICAM_CACHE_V2_3环境变量 。

    • 当安装脚本提示:
      "SDK install successs!"
      "Driver install success!"
      "Please restart the current terminal..."
      说明安装成功,重启终端后开始使用SDK 。

    • 安装脚本会加载摄像机的驱动程序,若重启电脑后,没有自动加载驱动,则需要手动加载驱动;如果内核版本不匹配,则需要您进入driver目录,选择一个与您正在使用的内核版本最接近的驱动版本进行手动安装,当提示“Driver install success!”,说明加载成功,请您重启终端后使用SDK,无需再次运行安装文件 。

    注:
    1. 环境变量在重启当前终端后生效!
    2. 由于GENICAM不支持中文,请勿将sdk安装到含有中文的路径中,会导致程序运行时产生异常报错 。
    3. 若移动或重命名安装程序后的文件夹,会导致环境变量无效,需重新执行安装程序 。

    二、Qt中设置环境

    1. 新建工程DH_test,将所需头文件及源文件添加进工程。
    2. 设置环境变量
      ①、点击Qt界面左侧的项目
      ②、找到Build中的构建环境,点击“详情”
      ③、在命令窗口中输入命令env查找变量路径
      ④、将GENICAM_ROOT_V2_3和GENICAM_GENTLxx_PATH添加到Qt的环境中

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (注意:路径末尾不要有空格否则编译时会报错)

    1. 修改.pro文件
    		#依赖库:
    		LIBS +=  
    		/usr/local/lib/lib*  \
    		-lgxiapi -ldximageproc\
    		-L$(GENICAM_ROOT_V2_3)/bin/Linux64_x64 \
    		-lGCBase_gcc40_v2_3 -lGenApi_gcc40_v2_3 -llog4cpp_gcc40_v2_3 -lLog_gcc40_v2_3 -lMathParser_gcc40_v2_3 
    		
    		#头文件搜索路径:
    		INCLUDEPATH += $(GENICAM_ROOT_V2_3)/library/CPP/include
    		INCLUDEPATH += $(GENICAM_ROOT_V2_3)/…/…/sdk/include
    		INCLUDEPATH += /usr/local/include \
    					  /usr/local/include/opencv \
    					  /usr/local/include/opencv2
    
    
    1. 编译成功后需要在命令窗中以管理员身份运行生成的文件
      (不要忘记插上相机)
    ./DH_test
    
    1. 遇到问题后请自行查找安装目录中的相关文件

    在这里插入图片描述

    展开全文
  • linux下使用opencv读取大恒相机

    千次阅读 2019-03-06 17:37:00
    大恒网口相机真的有点坑,api很难用,还好技术支持比较有耐心,一点一点的帮着解决了问题。 驱动安装 首先去大恒官网去下载linux下面的驱动,除了C++版本,还有python版本。一定要注意:linux下面安装驱动时,要看...

    前言

    大恒网口相机真的有点坑,api很难用,还好技术支持比较有耐心,一点一点的帮着解决了问题。

    驱动安装

    首先去大恒官网去下载linux下面的驱动,除了C++版本,还有python版本。一定要注意:linux下面安装驱动时,要看自己的内核版本支不支持相机的驱动,这一点很坑,要问清楚,到后面,也是费了很大劲才更换的内核。
    在这里插入图片描述
    在这里插入图片描述这是我这个相机驱动支持的linux内核,然后,安装驱动即可。
    在这里插入图片描述
    安装完驱动后,在tools文件夹中,有一个可执行文件,可以用来监测网口,运行即可。除此之外,还有一个可视化界面GalaxyView。
    在这里插入图片描述

    搭建工程

    编译完成的文件夹有一些例子,拿下图第一个例子为例,在QT中建立工程。
    在这里插入图片描述在QT中配置好路径,包括头文件和库文件。
    在这里插入图片描述

    INCLUDEPATH += /home/oliver/software/dhcam_install_20181107/dh_camera/daheng-sdk-x64/sdk/include
    
    LIBS += /home/oliver/software/dhcam_install_20181107/dh_camera/daheng-sdk-x64/sdk/lib/libdximageproc.so.1.0.1602.8161\
            /home/oliver/software/dhcam_install_20181107/dh_camera/daheng-sdk-x64/sdk/lib/libgxgvtl.so.1.0.1802.8051\
            /home/oliver/software/dhcam_install_20181107/dh_camera/daheng-sdk-x64/sdk/lib/libgxiapi.so.1.0.1810.8121\
            /home/oliver/software/dhcam_install_20181107/dh_camera/daheng-sdk-x64/sdk/lib/libgxu3vtl.so.1.0.1802.8051
    
    INCLUDEPATH += /usr/local/include\
    /usr/local/include/opencv\
    /usr/local/include/opencv2
    
    
    LIBS += /usr/local/lib/libopencv_*.so
    

    对源文件进行修改,修改的内容主要在void ProcGetImage(void pParam)函数中,还有定义char* m_rgb_image=NULL,下面有标注。

    //-------------------------------------------------------------
    /**
    \file      GxAcquireContinuous.cpp
    \brief     sample to show how to acquire image continuously. 
    \version   1.0.1605.9041
    \date      2016-05-04
    */
    //-------------------------------------------------------------
    
    #include "GxIAPI.h"
    #include"DxImageProc.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <iostream>
    #include<sstream>
    #include<fstream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    using namespace cv::dnn;
    
    #define MEMORY_ALLOT_ERROR -1 
    char* m_rgb_image=NULL; //增加的内容
    
    GX_DEV_HANDLE g_device = NULL;              ///< 设备句柄
    GX_FRAME_DATA g_frame_data = { 0 };         ///< 采集图像参数
    pthread_t g_acquire_thread = 0;             ///< 采集线程ID
    bool g_get_image = false;                   ///< 采集线程是否结束的标志:true 运行;false 退出
    
    //获取图像大小并申请图像数据空间
    int PreForImage();
    
    //释放资源
    int UnPreForImage();
    
    //采集线程函数
    void *ProcGetImage(void* param);
    
    //获取错误信息描述
    void GetErrorString(GX_STATUS error_status);
    
    int main()
    {
        uid_t user = 0;
        user = geteuid();
        if(user != 0)
        {
            printf("\n");  
            printf("Please run this application with 'sudo -E ./GxAcquireContinuous' or"
                                  " Start with root !\n");
            printf("\n");
            return 0;
        }
    
        printf("\n");
        printf("-------------------------------------------------------------\n");
        printf("sample to show how to acquire image continuously.\n");
        #ifdef __x86_64__
        printf("version: 1.0.1605.8041\n");
        #elif __i386__
        printf("version: 1.0.1605.9041\n");
        #endif
        printf("-------------------------------------------------------------\n");
        printf("\n");
    
        printf("Press [x] or [X] and then press [Enter] to Exit the Program\n");
        printf("Initializing......"); 
        printf("\n\n");
        
        
        usleep(2000000);   
         
        //API接口函数返回值 
        GX_STATUS status = GX_STATUS_SUCCESS;
    
        uint32_t device_num = 0;
        uint32_t ret = 0;
        GX_OPEN_PARAM open_param;
    
        //初始化设备打开参数,默认打开序号为1的设备
        open_param.accessMode = GX_ACCESS_EXCLUSIVE;
        open_param.openMode = GX_OPEN_INDEX;
        open_param.pszContent = "1";
    
        //初始化库
        status = GXInitLib(); 
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
            return 0;
        }
    
        //获取枚举设备个数
        status = GXUpdateDeviceList(&device_num, 1000);
        if(status != GX_STATUS_SUCCESS)
        { 
            GetErrorString(status);
            status = GXCloseLib();
            return 0;
        }
    
        if(device_num <= 0)
        {
            printf("<No device>\n");
            status = GXCloseLib();
            return 0;
        }
        else
        {
            //默认打开第1个设备
            status = GXOpenDevice(&open_param, &g_device);
            if(status == GX_STATUS_SUCCESS)
    	{
                printf("<Open device success>\n");
            }
            else
            {
                printf("<Open device fail>\n");
                status = GXCloseLib();
                return 0;			
            }
        }
    
        //设置采集模式为连续采集
        status = GXSetEnum(g_device, GX_ENUM_ACQUISITION_MODE, GX_ACQ_MODE_CONTINUOUS);
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
            status = GXCloseDevice(g_device);
            if(g_device != NULL)
            {
                g_device = NULL;
            }
            status = GXCloseLib();
            return 0;
        }
    
        //设置触发开关为OFF
        status = GXSetEnum(g_device, GX_ENUM_TRIGGER_MODE, GX_TRIGGER_MODE_OFF);
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
            status = GXCloseDevice(g_device);
            if(g_device != NULL)
            {
                g_device = NULL;
            }
            status = GXCloseLib();
            return 0;
        }
    	
        //为采集做准备    
        ret = PreForImage();
        if(ret != 0)    
        {
            printf("<Failed to prepare for acquire image>\n");
            status = GXCloseDevice(g_device);
            if(g_device != NULL)
            {
                g_device = NULL;
            }
            status = GXCloseLib();
            return 0;
        }
    
        //启动接收线程
        ret = pthread_create(&g_acquire_thread, 0, ProcGetImage, 0);
        if(ret != 0)
        {
            printf("<Failed to create the collection thread>\n");
            status = GXCloseDevice(g_device);
            if(g_device != NULL)
            {
                g_device = NULL;
            }
            status = GXCloseLib();
            return 0;
        }
    
        bool run = true;
        while(run == true)
        {
            int c = getchar();
    
            switch(c)
            {
                //退出程序
                case 'X': 
                case 'x':
                    run = false;
                    break;
                default:
                    break;
            }	
        }
    
        //为停止采集做准备
        ret = UnPreForImage();
        if(ret != 0)
        {
            status = GXCloseDevice(g_device);
            if(g_device != NULL)
            {
                g_device = NULL;
            }
            status = GXCloseLib();
            return 0;
        }
    
        //关闭设备
        status = GXCloseDevice(g_device);
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
            if(g_device != NULL)
            {
                g_device = NULL;
            }
            status = GXCloseLib();
            return 0;
        }
    
        //释放库
        status = GXCloseLib();
        return 0;
    }
    
    //-------------------------------------------------
    /**
    \brief 获取图像大小并申请图像数据空间
    \return void
    */
    //-------------------------------------------------
    int PreForImage()
    {
        GX_STATUS status = GX_STATUS_SUCCESS;
        int64_t payload_size = 0;
    	
        status = GXGetInt(g_device, GX_INT_PAYLOAD_SIZE, &payload_size);
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
            return status;
        }
    	
        g_frame_data.pImgBuf = malloc(payload_size);
        if(g_frame_data.pImgBuf == NULL)
        {
            printf("<Failed to allot memory>\n");
            return MEMORY_ALLOT_ERROR;
        }
     
        return 0;
    }
    
    //-------------------------------------------------
    /**
    \brief 释放资源
    \return void
    */
    //-------------------------------------------------
    int UnPreForImage()
    {
        GX_STATUS status = GX_STATUS_SUCCESS;
        uint32_t ret = 0;
       
        //发送停采命令
        status = GXSendCommand(g_device, GX_COMMAND_ACQUISITION_STOP);
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
            return status;
        }
    
        g_get_image = false;
        ret = pthread_join(g_acquire_thread,NULL);
        if(ret != 0)
        {
            printf("<Failed to release resources>\n");
            return ret;
        }
    	
    
        //释放buffer
        if(g_frame_data.pImgBuf != NULL)
        {
            free(g_frame_data.pImgBuf);
            g_frame_data.pImgBuf = NULL;
        }
    
        return 0;
    }
    
    //-------------------------------------------------
    /**
    \brief 采集线程函数
    \param pParam 线程传入参数
    \return void*
    */
    //-------------------------------------------------
    void *ProcGetImage(void* pParam)
    {
        GX_STATUS status = GX_STATUS_SUCCESS;
    
        //接收线程启动标志
        g_get_image = true;
    
        //发送开采命令
        status = GXSendCommand(g_device, GX_COMMAND_ACQUISITION_START);
        if(status != GX_STATUS_SUCCESS)
        {
            GetErrorString(status);
        }
    	
        while(g_get_image)
        {
            if(g_frame_data.pImgBuf == NULL)
            {
                continue;
            }
    
            status = GXGetImage(g_device, &g_frame_data, 100);
            if(status == GX_STATUS_SUCCESS)
            {
                if(g_frame_data.nStatus == 0)
                {
                   //增加的内容
                    Mat src;
                    m_rgb_image=new char[g_frame_data.nWidth*g_frame_data.nHeight*3];
    
                    src.create(g_frame_data.nHeight,g_frame_data.nWidth,CV_8UC3);
    
                    memcpy(src.data,g_frame_data.pImgBuf,g_frame_data.nWidth*g_frame_data.nHeight);
    
                    DxRaw8toRGB24(g_frame_data.pImgBuf,m_rgb_image,g_frame_data.nWidth, g_frame_data.nHeight,RAW2RGB_NEIGHBOUR,DX_PIXEL_COLOR_FILTER(BAYERBG),false);
    
                    memcpy(src.data,m_rgb_image,g_frame_data.nWidth*g_frame_data.nHeight*3);
                    namedWindow("test",0);
                    imshow("test",src);
                    waitKey(10); 
                    //到这里增加结束
                    printf("<Successful acquisition : Width: %d Height: %d >\n", g_frame_data.nWidth, g_frame_data.nHeight);
                }
            }
        }
    }
    
    //----------------------------------------------------------------------------------
    /**
    \brief  获取错误信息描述
    \param  emErrorStatus  错误码
    
    \return void
    */
    //----------------------------------------------------------------------------------
    void GetErrorString(GX_STATUS error_status)
    {
        char *error_info = NULL;
        size_t size = 0;
        GX_STATUS status = GX_STATUS_SUCCESS;
    	
        // 获取错误描述信息长度
        status = GXGetLastError(&error_status, NULL, &size);
        if(status != GX_STATUS_SUCCESS)
        {
               GetErrorString(status);
    	   return;
        }
    	
        error_info = new char[size];
        if (error_info == NULL)
        {
            printf("<Failed to allocate memory>\n");
            return ;
        }
    	
        // 获取错误信息描述
        status = GXGetLastError(&error_status, error_info, &size);
        if (status != GX_STATUS_SUCCESS)
        {
            printf("<GXGetLastError call fail>\n");
        }
        else
        {
            printf("%s\n", (char*)error_info);
        }
    
        // 释放资源
        if (error_info != NULL)
        {
            delete []error_info;
            error_info = NULL;
        }
    }
    
    

    显示结果

    在这里插入图片描述在这里插入图片描述

    展开全文
  • opencv使用大恒相机的痛苦经历

    万次阅读 2017-04-14 17:14:11
    ),挑了个国产的相机大恒的DH-HV3151UC 从到货那天开始经历了整整一周的折磨(不过也了解了许多相机硬件相关的知识) 但是,不是我不支持国货,外国货插上就能用简直太棒了好不。。。 拿到相机和镜头当晚,就...

    做毕业设计需要用到工业相机,之前的IDS需要还了,心想买个便宜点的(毕竟做完毕设就离开实验室了,太贵不好。。),挑了个国产的相机,大恒的DH-HV3151UC

    从到货那天开始经历了整整一周的折磨(不过也了解了许多相机硬件相关的知识)

    但是,不是我不支持国货,外国货插上就能用简直太棒了好不。。。

    拿到相机和镜头当晚,就迫切得打开架到试验台上了,可是将镜头的调焦环拧了一遍,画面都是黑压压一片(对了,首先你得安装坑爹的驱动、demo,至于为什么坑爹下文再说。。。),非常郁闷,就像泡面都煮开了却没有筷子。调节了非常久,结果问了老板发现是相机支持两种接口(C/CS),之前选型看参数也注意到不过没有太重视,原来拧开相机芯片盖子的时候将转接口也拧了下来了,拧下来就支持CS口,装上去就支持C口的相机,两个接口除了到相机芯片的长度差了5mm,其余的就没什么区别了。

    看到清晰的画面,不由得心想总算可以开展算法研究了,而真正的大坑才刚刚开始。

    先是用opencv的试图打开相机(因为之前用过IDS是支持opencv函数的),但是接着就发现根!本!行!不!通!大恒相机需要用到他们的SDK开发程序。好吧,那就用你们的SDK吧,于是又头文件,又链接库,总算可以用它的第一个函数(获取设备总数的),正常!可喜可贺!接着总能打开相机了吧。抱歉,还是不行。打开设备TM给我报错,说是整数被零给除了,还是在dll里出的错。我遍历了各种办法,甚至打算反汇编了。。。ORZ。。。后来师兄一句惊醒梦中人,找大恒的人啊!

    于是,打给客服,说是总部,给了个技术支持的电话,又打过去,结果通话中。。。过了一会又打过去。。。。还是通话中。。。。第二天早上又试。。。还是。。。还是。。。最后黄天不负有心人。。。终于打通了。。。。发了邮件详细阐明编译的各种问题。。。结果到了下午回了几句话:只支持到win7.。。。

    好吧,要换平台。。。

    装虚拟机、win7、vs2013、opencv,加上河源的网速,又花了一天。

    终于,调用SDK成功。

    可是事情还没完,显示不正常。。。偏红太厉害了,于是又开始白平衡的学习、调节,还是没办法。

    又看SDK函数,发现一个可能导致错误的参数。。。原来这款相机的阵列顺序不是RGB也不是BGR而是。。。你例程怎么就是。。。GRB了呢。。。

    终于正常显示图片了。。。。

     

    展开全文
  • 在VS2017环境下,通过OpenCV大恒提供的SDK按照IP、MAC地址或序列号打开指定型号的相机,并通过回调和直接采集两种方式获取图像,并将获取的图像保存成OpenCV的Mat格式。对于同一台电脑上连接多台相机的情况,可以...
  • Qt+大恒相机+OpenCV+MinGW界面开发

    千次阅读 热门讨论 2019-08-16 22:31:38
    Qt+大恒相机+OpenCV+MinGW界面开发踩坑实录遇到的坑有哪些?大恒相机接口的问题(C与C++选谁,傻傻分不清)OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出)关于打包总结 博主最近在用Qt从事...
  • opencv打开大恒水晶相机教程

    千次阅读 2017-10-22 11:10:50
    opencv打开图像的方式和自带程序打开方式不同,因此需要调用相机的封装程序。依赖文件: 1.驱动----需要安装相机软件 2.头文件-----一般在Samples里面  3.lib库------也在Samples里面VC SDK/lib   步骤一: ...
  • 大恒水晶相机opencv打开程序,可以实现视频的实时查看
  • 大恒相机开发(大恒SDK+opencv开发 一.项目简介 在大三上学期做过人脸识别的开发,刚好下学期老师手中有相机的项目,然后项目就到了我手上,下面是我开发这个项目的一些经历,进程还在调试中。笔记会按照我的进度...
  • 使用Opencv大恒C++ SDK采集大恒水星相机图像

    千次阅读 热门讨论 2018-12-12 16:06:03
    在项目中,使用了大恒的水星相机,需要把图存成Opencv的Mat形式。大恒C++ SDK采集的图像数据不能直接把图像的数据存进Mat,需要将原始数据(我这里是BayerRG8)经过格式转换之后转变成RGB24的格式,直接调用SDK的...
  • Python调用大恒相机录制视频(Ubuntu16.04) 文章目录Python调用大恒相机录制视频(Ubuntu16.04)环境配置视频录制代码问题解答 环境配置 驱动安装:...
  • 大恒相机sdk开发+opencv开发笔记三 1.相机模式选择 当我们初始化相机之后此时我们需要设置相机的图像采集模式 我们用到GXSetEnum接口 代码样例: GX_STATUS status = GX_STATUS_SUCCESS; int64_tnValue = GX_GAIN_...
  • 大恒相机录屏终于解决了(python+sdk+opencv) 一开始拿到大恒相机,就遇上了第一个坑:直接用opencv函数是打不开的,要用他自己sdk的gxipy。用了之后,给的示例只有采集图片的,录屏如下: ```python import gxipy...
  • 大恒相机sdk开发+opencv开发笔记七 工业相机转换成Mat 类型 一 .Mat类型 Mat基本上是一个具有两个数据部分的类:矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)和指向包含像素值(取决于所选...
  • 大恒相机sdk开发+opencv开发笔记五 1.相机开始采集 之前已经进行到相机回调函数此时我们需要发送采集命令 GXSendCommand 形参和之前的API基本是差不多的。 可能这里就有同学问了,我们之前不是用了回调函数,程序...
  • 大恒相机sdk开发+opencv开发笔记六 1.GXCloseDevice接口 就像我第一章的开发笔记说的,我们回家用钥匙打开了房间,现在我们要走了,那么我们同样用钥匙关上门并上锁。 2.GXCloseLib接口 和开始的初始化对应这个...
  • 一、首先搭建vs环境,这里主要介绍怎么配置大恒图像的水星二代的sdk a) 新建空项目,选择项目->属性->VC++目录->包含目录,添加下列两个inc文件(来源于官网下载的驱动软件的sample里) b) 选择项目-&...
  • 使用大恒sdk黑白相机结合opencv的图像采集 关键是实现大恒的数据到opencv里面的Mat矩阵的数据转换。 下面是关键代码 Mat curr(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC1);...
  • VS2015+OpenCV+大恒MER-Gx系列工业相机

    千次阅读 热门讨论 2019-01-06 16:10:27
    VS2015+OpenCV+大恒MER-Gx系列工业相机1.实验所需2.建立C++项目3. 添加源文件4.感言 本人C++和OpenCV基础比较薄弱,VS2015庞杂的处理界面又让人应接不暇。之前偶尔使用网络摄像头,勉强能够完成基础操作;偶尔进行...
  • ![图片说明]... 就是简单的打开大恒相机,输出一下图像,但是显示不正确,图像如下。![图片说明](https://img-ask.csdn.net/upload/202001/21/1579573852_841217.jpg)
  • ROS驱动大恒相机采集数据并转化为opencv格式,然后可以通过opencv进行二次开发,图像处理等操作。前提是先去大恒官网下载Linux相机驱动并安装,不然编译会报错。
  • MFC打开大恒相机

    2017-11-29 16:44:05
    VS2013打开大恒相机,有开始采集和停止采集,打开设备和关闭设备四个控制按钮,获取的相机图像源通过Opencv 显示到mfc的界面上,方便对接下来的获取的图片再进行下一步处理;注意事项:1. 请先安装大恒相机的驱动,...
  • #include"GxIAPI.h" //图像回调处理函数 staticvoidGX_STDCOnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM* pFrame) { if (pFrame->status == GX_FRAME_STATUS_ SUCCESS) ...}

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

opencv大恒相机