大恒相机二次开发流程介绍

(一)整体工作流程

(二)相机控制流程

(三)相机采集流程

当前 GalaxySDK 支持三种采集方式: GetImage 、回调采集、 DQBuf
1. GetImage :通过深拷贝方式获取一副图像,获取完成后,采集 buffer 会归还给采集系统继续循环获取图像;
2. 回调采集:通过注册采集回调函数的方式进行图像获取处理,回调函数执行流程中,会持续持有当前的采集的buffer ,从而可以实现零拷贝使用;
回调函数执行过程中,是无法进入下一次回调的,也就是无法获取到下一帧图像进行处理。所以在对帧率有要求的使 用场景中,并不适合在回调函数中完成太复杂的任务。一般就是进行简单的处理,或者将图像 buffer 拷贝到其他位置进行 后续处理;
3.DQBuf :类似 GetImage 使用,并且是零拷贝的一种采集方式,可以直接获取和使用采集buffer中的图像数据,不进行任何拷贝;通过 DQBuf 获取采集 buffer ,使用完成后通过 QBuf 将该采集buffer 归还给采集系统继续循环获取图像;

1.DQBuf 采集流程(零拷贝)

1)采集流程图

2)代码示例

C语言

//-------------------------------
//GXDQBuf 接口一次获取一帧图像,本样例代码演示的就是如何用此接口获取一帧图像
//-------------------------------
#include "GxIAPI.h"
int main(int argc, char* argv[])
{
    GX_STATUS emStatus = GX_STATUS_SUCCESS;
    GX_DEV_HANDLE hDevice = NULL;
    uint32_t ui32DeviceNum = 0;
    //初始化库
    emStatus = GXInitLib();
    if (emStatus != GX_STATUS_SUCCESS)
    {
        return 0;
    }
    //枚举设备列表
    emStatus = GXUpdateAllDeviceList(&ui32DeviceNum, 1000);
    if ((emStatus != GX_STATUS_SUCCESS) || (ui32DeviceNum <= 0))
    {
        return 0;
    }
    //打开设备
    GX_OPEN_PARAM stOpenParam;
    stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;
    stOpenParam.openMode = GX_OPEN_INDEX;
    stOpenParam.pszContent = "1";
    emStatus = GXOpenDevice(&stOpenParam, &hDevice);
    if (emStatus == GX_STATUS_SUCCESS)
    {
        //定义 GXDQBuf 的传入参数
        GX_FRAME_BUFFER pFrameBuffer;
        //开采
        #ifdef __linux__
            emStatus = GXStreamOn(hDevice);
        #else
            emStatus = GXSetCommandValue(hDevice, "AcquisitionStart");
        #endif
        if (emStatus == GX_STATUS_SUCCESS)
        {
            //调用 GXDQBuf 取一帧图像
            emStatus = GXDQBuf(hDevice, &pFrameBuffer, 1000);
            if (emStatus == GX_STATUS_SUCCESS)
            {
                if (pFrameBuffer-> nStatus == GX_FRAME_STATUS_SUCCESS)
                {
                      //图像获取成功
                      //对图像进行处理
                     //调用 GXQBuf 将图像 buf 放回库中继续采图
                    emStatus = GXQBuf(hDevice, pFrameBuffer);
                }
            }
        //停采
        #ifdef __linux__
            emStatus = GXStreamOff(hDevice);
        #else
            emStatus = GXSetCommandValue(hDevice, "AcquisitionStop");
        #endif
    }
    emStatus = GXCloseDevice(hDevice);
    emStatus = GXCloseLib();
    return 0;
}

c++

#include <iostream>
#include "stdafx.h"
#include "GalaxyIncludes.h"

using namespace std;

struct THREAD_PARAM
{
	bool bRun;
	CGXStreamPointer pStream;
};

// 线程函数
DWORD WINAPI GrabImgThread(LPVOID lpParam) 
{
	THREAD_PARAM* pThreadParam = (THREAD_PARAM*)lpParam;
	if (NULL == pThreadParam)
	{
		cout << "lpParam is NULL!" << endl;
		return 0;
	}

	while (pThreadParam->bRun)
	{
		try
		{
			//零拷贝采集一帧图像
			CImageDataPointer pImgData = pThreadParam->pStream->DQBuf(1000);
			if (GX_FRAME_STATUS_SUCCESS == pImgData->GetStatus())
			{
				cout << "<Successful acquisition: Width: " << pImgData->GetWidth() <<
					" Height: " << pImgData->GetHeight() << " FrameID: "<< pImgData->GetFrameID() <<
					">" << endl;
			}
			else
			{
				cout << "<Abnormal Acquisition: Exception code: " << pImgData->GetStatus() << ">" << endl;
			}
			//将采集图像buffer还回到采集系统
			pThreadParam->pStream->QBuf(pImgData);
		}
		catch (CGalaxyException &e)
		{
			cout << "<" << e.GetErrorCode() << ">" << "<" << e.what() << ">" << endl;
		}
		catch (std::exception &e)
		{
			cout << "<" << e.what() << ">" << endl;
		}
		
	}

	cout << "<Acquisition thread Exit!>" << endl;
	
	return 0;
}

int main(int argc, char* argv[])
{
	try
	{
		//初始化设备库
		IGXFactory::GetInstance().Init();

		//枚举相机设备
		GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
		IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);

		//判断当前设备连接个数
		if (vectorDeviceInfo.size() <= 0)
		{
			cout << "No device!" << endl;
			return 0;
		}

		//通过SN打开相机设备
		CGXDevicePointer pDevice = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(), GX_ACCESS_EXCLUSIVE);
		//获取相机属性控制对象
		CGXFeatureControlPointer pRemoteControl = pDevice->GetRemoteFeatureControl();
		//流层对象
		CGXStreamPointer pStream;
		if (pDevice->GetStreamCount() > 0)
		{
			pStream = pDevice->OpenStream(0);
		}
		else
		{
			cout << "Not find stream!";
			return 0;
		}
		
		//选择默认参数组
		pRemoteControl->GetEnumFeature("UserSetSelector")->SetValue("Default");
		//加载参数组
		pRemoteControl->GetCommandFeature("UserSetLoad")->Execute();

		cout << "***********************************************" << endl;
		cout << "<Vendor Name:   " << pDevice->GetDeviceInfo().GetVendorName() << ">" << endl;
		cout << "<Model Name:    " << pDevice->GetDeviceInfo().GetModelName() << ">" << endl;
		cout << "<Serial Number: " << pDevice->GetDeviceInfo().GetSN() << ">" << endl;
		cout << "***********************************************" << endl << endl;

		cout << "Press [a] or [A] and then press [Enter] to start acquisition" << endl;
		cout << "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值