大恒相机使用opencv的回调采集与连续采集

代码

使用了回调采集,在while(1){}循环时,控制台窗口会不断的输出图像的尺寸,说明是已经采集到了图像了。

#include<iostream>
#include<tchar.h>

//请用户提前配置好工程头文件目录,需要包含GalaxyIncludes.h
#include"GalaxyIncludes.h"
#include<opencv2\core.hpp>
#include<opencv2\imgproc.hpp>
#include<opencv2\highgui.hpp>
#include<string>
using namespace std;
using namespace cv;

class CSampleCaptureEventHandler : public ICaptureEventHandler{

public:
	void DoOnImageCaptured(CImageDataPointer& objImageDataPointer, void* pUserParam)
	{

		if (objImageDataPointer->GetStatus() == GX_FRAME_STATUS_SUCCESS)

		{
			
			//图像获取为完整帧,可以读取图像宽、高、数据格式等
			uint64_t nWidth = objImageDataPointer->GetWidth();
			uint64_t nHeight = objImageDataPointer->GetHeight();
			GX_PIXEL_FORMAT_ENTRY emPixelFormat = objImageDataPointer->GetPixelFormat();
			//其他图像信息的获取参见IImageData接口定义
			//如果正常连续输出图片的宽,高,说明处于连续采集的状态
			cout << nWidth << " " << nHeight << endl;
			//cv::Mat SrcImage(objImageDataPointer->GetHeight(), objImageDataPointer->GetWidth(), CV_8UC1);
			//void* pRaw8Buffer = NULL;
			//pRaw8Buffer = objImageDataPointer->ConvertToRaw8(GX_BIT_0_7);
			//memcpy(SrcImage.data, pRaw8Buffer, (objImageDataPointer->GetHeight())*(objImageDataPointer->GetWidth()));
			//cv::flip(SrcImage, SrcImage, 0);//大恒的图像要进行翻转
			//imshow("1", SrcImage);
		}

	}
};

int main() {

	//在调用其他接口之前必须调用IGXFactory::GetInstance().Init()接口执行初始化。
	IGXFactory::GetInstance().Init();

	//枚举设备
	GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
	IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
	for (uint32_t i = 0; i < vectorDeviceInfo.size(); i++) {
		cout << vectorDeviceInfo[i].GetVendorName() << endl;
		cout << vectorDeviceInfo[i].GetModelName() << endl;
		//更多设备信息详见IGXDeviceInfo接口
	}

	//打开设备
	if (vectorDeviceInfo.size() > 0) {
		//打开链表中的第一个设备
		CGXDevicePointer objDevicePtr;

		GxIAPICPP::gxstring strSN = vectorDeviceInfo[0].GetSN();
		cout << strSN << endl;

		objDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(strSN, GX_ACCESS_EXCLUSIVE);//目前只能通过strSN打开

		CGXStreamPointer objStreamPtr = objDevicePtr->OpenStream(0);

		//注册采集回调函数,注意第一个参数是用户私有参数,用户可以传入任何object对象,也可以是null

		//用户私有参数在回调函数内部还原使用,如果不使用私有参数,可以传入null
		ICaptureEventHandler* pCaptureEventHandler = new CSampleCaptureEventHandler();

		objStreamPtr->RegisterCaptureCallback(pCaptureEventHandler, NULL);

		//开启流通道采集

		objStreamPtr->StartGrab();

		//给设备发送开采命令

		CGXFeatureControlPointer objFeatureControlPtr = objDevicePtr->GetRemoteFeatureControl();

		objFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();

		//回调采集过程,参见回调函数
		//while (1) {
		//	//进入循环之后会进行连续采集,不断地打印出图片的长和宽
		//}

		//停采、注销采集回调函数

		objFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();

		objStreamPtr->StopGrab();

		objStreamPtr->UnregisterCaptureCallback();

		delete pCaptureEventHandler;

		pCaptureEventHandler = NULL;

		objDevicePtr->Close();//关闭相机并释放资源
	}

	IGXFactory::GetInstance().Uninit();
	return 0;
}

示例代码

使用相机型号:大恒MER-503-36U3M黑白相机

发现注册远端相机事件会触发异常,因此将这段代码给注释掉了,否则会直接跳入异常而跳出。
这段代码在控制台中使用了了一个getchar()命令,方便在后期的时候能够跳出控制台程序

//#include"stdafx.h"

#include<iostream>

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;

   }

};

 

int main(int argc, char* 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(20000);
 

          注册远端设备事件:曝光结束事件【目前只有千兆网系列相机支持曝光结束事件】

          选择事件源

          //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;

}
  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用OpenCV大恒C SDK可以轻松地采集大恒水星相机图像。首先,需要下载和安装相应的SDK和库,并确保与相机的连接正常。接下来,可以使用OpenCV提供的函数来打开相机,并设置相应的参数,如分辨率和帧率。然后,可以通过循环不断地从相机中读取图像帧,并使用OpenCV进行图像处理和分析。 可以使用OpenCV中的cv::VideoCapture类来打开相机连接,并设置相应的参数。例如: ``` cv::VideoCapture capture; capture.open(0); // 打开相机连接 if (!capture.isOpened()) { // 相机连接失败 return -1; } capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280); // 设置图像宽度 capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720); // 设置图像高度 capture.set(cv::CAP_PROP_FPS, 30); // 设置帧率 ``` 然后,可以在循环中读取相机图像,并使用OpenCV函数进行处理。例如,可以使用cv::imshow函数显示图像使用cv::imwrite保存图像使用cv::cvtColor将图像转换为不同的颜色空间等等。 ``` cv::Mat frame; while (capture.read(frame)) { cv::imshow("Camera", frame); // 显示图像 // 进行其他的图像处理操作 int key = cv::waitKey(1); if (key == 27) { // 按下Esc键退出循环 break; } } ``` 最后,记得在程序结束时,释放相机连接和关闭窗口: ``` capture.release(); // 释放相机连接 cv::destroyAllWindows(); // 关闭窗口 ``` 以上就是使用OpenCV大恒C SDK采集大恒水星相机图像的基本步骤。可以根据实际需求,结合OpenCV提供的丰富功能,进行图像处理、计算机视觉和图像分析等任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值