//------------------------------- //GXGetImage 接口一次获取一帧图像,本样例代码演示的就是如何用此接口获取一帧图像 //------------------------------- #include "GxIAPI.h" int main(intargc, char* argv[]) { 7.GxIAPI 库说明 版权所有©中国大恒(集团)有限公司北京图像视觉技术分公司 139 GX_STATUS status = GX_STATUS_SUCCESS; GX_DEV_HANDLE hDevice = NULL; GX_OPEN_PARAM stOpenParam; uint32_t nDeviceNum = 0; //初始化库 status = GXInitLib(); if (status!= GX_STATUS_SUCCESS) { return 0; } //枚举设备列表 status = GXUpdateDeviceList(&nDeviceNum, 1000); if ((status!= GX_STATUS_SUCCESS)||(nDeviceNum<= 0)) { return 0; } //打开设备 stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE; stOpenParam.openMode = GX_OPEN_INDEX; stOpenParam.pszContent = "1"; status = GXOpenDevice(&stOpenParam, &hDevice); if (status == GX_STATUS_SUCCESS) { //设置相机的流通道包长属性,提高网络相机的采集性能 bool bImplementPacketSize = false; uint32_t unPacketSize = 0; // 判断设备是否支持流通道数据包功能 status = GXIsImplemented(hDevice, GX_INT_GEV_PACKETSIZE, &bImplementPacketSize); if (bImplementPacketSize) { // 获取当前网络环境的最优包长 status = GXGetOptimalPacketSize (hDevice, &unPacketSize); // 将最优包长设置为当前设备的流通道包长值 status = GXSetInt (hDevice, GX_INT_GEV_PACKETSIZE, unPacketSize); } int64_t nPayLoadSize = 0; //获取图像 buffer 大小,下面动态申请内存 status = GXGetInt(hDevice, GX_INT_PAYLOAD_SIZE, &nPayLoadSize); if (status == GX_STATUS_SUCCESS&&nPayLoadSize> 0) { //定义 GXGetImage 的传入参数 GX_FRAME_DATA stFrameData; //根据获取的图像 buffer 大小 m_nPayLoadSize 申请 buffer stFrameData.pImgBuf= malloc((size_t)nPayLoadSize); //发送开始采集命令 status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_START); if (status == GX_STATUS_SUCCESS) { //调用 GXGetImage 取一帧图像 while(GXGetImage(hDevice, &stFrameData, 100) != GX_STATUS_SUCCESS) { Sleep(10); } if (stFrameData.nStatus == GX_FRAME_STATUS_ SUCCESS) { //图像获取成功 //对图像进行处理... } } //发送停止采集命令 status = GXSendCommand(hDevice, GX_COMMAND_ACQUISITION_STOP); //释放图像缓冲区 buffer free(stFrameData.pImgBuf); } } status = GXCloseDevice(hDevice); status = GXCloseLib(); return 0; }