lidar_camera_cablition/CameraDriver.cpp
2024-12-16 12:30:52 +08:00

1086 lines
28 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "CameraDriver.h"
extern "C"{
// ***********开始: 这部分处理与SDK操作相机无关用于显示设备列表 ***********
// ***********BEGIN: These functions are not related to API call and used to display device info***********
// 数据帧回调函数
// Data frame callback function
static void onGetFrame(IMV_Frame* pFrame, void* pUser)
{
if (pFrame == NULL)
{
printf("pFrame is NULL\n");
return;
}
printf("Get frame blockId = %llu\n", pFrame->frameInfo.blockId);
return;
}
static void displayDeviceInfo(IMV_DeviceList deviceInfoList)
{
IMV_DeviceInfo* pDevInfo = NULL;
unsigned int cameraIndex = 0;
char vendorNameCat[11];
char cameraNameCat[16];
// 打印Title行
// Print title line
printf("\nIdx Type Vendor Model S/N DeviceUserID IP Address \n");
printf("------------------------------------------------------------------------------\n");
for (cameraIndex = 0; cameraIndex < deviceInfoList.nDevNum; cameraIndex++)
{
pDevInfo = &deviceInfoList.pDevInfo[cameraIndex];
// 设备列表的相机索引 最大表示字数3
// Camera index in device list, display in 3 characters
printf("%-3d", cameraIndex + 1);
// 相机的设备类型GigEU3VCLPCIe
// Camera type
switch (pDevInfo->nCameraType)
{
case typeGigeCamera:printf(" GigE");break;
case typeU3vCamera:printf(" U3V ");break;
case typeCLCamera:printf(" CL ");break;
case typePCIeCamera:printf(" PCIe");break;
default:printf(" ");break;
}
// 制造商信息 最大表示字数10
// Camera vendor name, display in 10 characters
if (strlen(pDevInfo->vendorName) > 10)
{
memcpy(vendorNameCat, pDevInfo->vendorName, 7);
vendorNameCat[7] = '\0';
strcat(vendorNameCat, "...");
printf(" %-10.10s", vendorNameCat);
}
else
{
printf(" %-10.10s", pDevInfo->vendorName);
}
// 相机的型号信息 最大表示字数10
// Camera model name, display in 10 characters
printf(" %-10.10s", pDevInfo->modelName);
// 相机的序列号 最大表示字数15
// Camera serial number, display in 15 characters
printf(" %-15.15s", pDevInfo->serialNumber);
// 自定义用户ID 最大表示字数15
// Camera user id, display in 15 characters
if (strlen(pDevInfo->cameraName) > 15)
{
memcpy(cameraNameCat, pDevInfo->cameraName, 12);
cameraNameCat[12] = '\0';
strcat(cameraNameCat, "...");
printf(" %-15.15s", cameraNameCat);
}
else
{
printf(" %-15.15s", pDevInfo->cameraName);
}
// GigE相机时获取IP地址
// IP address of GigE camera
if (pDevInfo->nCameraType == typeGigeCamera)
{
printf(" %s", pDevInfo->DeviceSpecificInfo.gigeDeviceInfo.ipAddress);
}
printf("\n");
}
return;
}
static char* trim(char* pStr)
{
char* pDst = pStr;
char* pTemStr = NULL;
if (pDst != NULL)
{
pTemStr = pDst + strlen(pStr) - 1;
while (*pDst == ' ')
{
pDst++;
}
while ((pTemStr > pDst) && (*pTemStr == ' '))
{
*pTemStr-- = '\0';
}
}
return pDst;
}
static int isInputValid(char* pInpuStr)
{
char numChar;
char* pStr = pInpuStr;
while (*pStr != '\0')
{
numChar = *pStr;
if ((numChar > '9') || (numChar < '0'))
{
return -1;
}
pStr++;
}
return 0;
}
static unsigned int selectDevice(unsigned int cameraCnt)
{
char inputStr[256];
char* pTrimStr;
int inputIndex = -1;
int ret = -1;
char* find = NULL;
printf("\nPlease input the camera index: ");
while (1)
{
memset(inputStr, 0, sizeof(inputStr));
fgets(inputStr, sizeof(inputStr), stdin);
// 清空输入缓存
// clear flush
fflush(stdin);
// fgets比gets多吃一个换行符号取出换行符号
// fgets eats one more line feed symbol than gets, and takes out the line feed symbol
find = strchr(inputStr, '\n');
if (find) { *find = '\0'; }
pTrimStr = trim(inputStr);
ret = isInputValid(pTrimStr);
if (ret == 0)
{
inputIndex = atoi(pTrimStr);
// 输入的序号从1开始
// Input index starts from 1
inputIndex -= 1;
if ((inputIndex >= 0) && (inputIndex < (int)cameraCnt))
{
break;
}
}
printf("Input invalid! Please input the camera index: ");
}
return (unsigned int)inputIndex;
}
// ***********结束: 这部分处理与SDK操作相机无关用于显示设备列表 ***********
// ***********END: These functions are not related to API call and used to display device info***********
static int setSoftTriggerConf(void* libHandle, IMV_HANDLE devHandle)
{
int ret = IMV_OK;
// 获取设置触发源为软触发函数地址
DLL_SetEnumFeatureSymbol DLLSetEnumFeatureSymbol = (DLL_SetEnumFeatureSymbol)dlsym(libHandle, "IMV_SetEnumFeatureSymbol");
if (NULL == DLLSetEnumFeatureSymbol)
{
printf("Get IMV_SetEnumFeatureSymbol address failed!\n");
return ret;
}
// 设置触发源为软触发
// Set trigger source to Software
ret = DLLSetEnumFeatureSymbol(devHandle, "TriggerSource", "Software");
if (IMV_OK != ret)
{
printf("Set triggerSource value failed! ErrorCode[%d]\n", ret);
return ret;
}
// 设置触发器
// Set trigger selector to FrameStart
ret = DLLSetEnumFeatureSymbol(devHandle, "TriggerSelector", "FrameStart");
if (IMV_OK != ret)
{
printf("Set triggerSelector value failed! ErrorCode[%d]\n", ret);
return ret;
}
// 设置触发模式
// Set trigger mode to On
ret = DLLSetEnumFeatureSymbol(devHandle, "TriggerMode", "On");
if (IMV_OK != ret)
{
printf("Set triggerMode value failed! ErrorCode[%d]\n", ret);
return ret;
}
return ret;
}
// Image convert
static int imageConvert(void* libHandle, IMV_HANDLE devHandle, IMV_Frame frame, IMV_EPixelType convertFormat,void** data, int& w, int& h)
{
IMV_PixelConvertParam stPixelConvertParam;
unsigned char* pDstBuf = NULL;
unsigned int nDstBufSize = 0;
int ret = IMV_OK;
FILE* hFile = NULL;
const char* pFileName = NULL;
const char* pConvertFormatStr = NULL;
// 获取设置触发源为软触发函数地址
DLL_PixelConvert DLLPixelConvert = (DLL_PixelConvert)dlsym(libHandle, "IMV_PixelConvert");
if (NULL == DLLPixelConvert)
{
printf("Get IMV_PixelConvert address failed!\n");
return ret;
}
switch (convertFormat)
{
case gvspPixelRGB8:
nDstBufSize = sizeof(unsigned char) * frame.frameInfo.width * frame.frameInfo.height * 3;
pFileName = (const char*)"convertRGB8.bmp";
pConvertFormatStr = (const char*)"RGB8";
break;
case gvspPixelBGR8:
nDstBufSize = sizeof(unsigned char) * frame.frameInfo.width * frame.frameInfo.height * 3;
pFileName = (const char*)"convertBGR8.bmp";
pConvertFormatStr = (const char*)"BGR8";
break;
case gvspPixelBGRA8:
nDstBufSize = sizeof(unsigned char) * frame.frameInfo.width * frame.frameInfo.height * 4;
pFileName = (const char*)"convertBGRA8.bmp";
pConvertFormatStr = (const char*)"BGRA8";
break;
case gvspPixelMono8:
default:
nDstBufSize = sizeof(unsigned char) * frame.frameInfo.width * frame.frameInfo.height;
pFileName = (const char*)"convertMono8.bmp";
pConvertFormatStr = (const char*)"Mono8";
break;
}
pDstBuf = (unsigned char*)malloc(nDstBufSize);
if (NULL == pDstBuf)
{
printf("malloc pDstBuf failed!\n");
return -1;
}
// 图像转换成BGR8
// convert image to BGR8
memset(&stPixelConvertParam, 0, sizeof(stPixelConvertParam));
stPixelConvertParam.nWidth = frame.frameInfo.width;
stPixelConvertParam.nHeight = frame.frameInfo.height;
stPixelConvertParam.ePixelFormat = frame.frameInfo.pixelFormat;
stPixelConvertParam.pSrcData = frame.pData;
stPixelConvertParam.nSrcDataLen = frame.frameInfo.size;
stPixelConvertParam.nPaddingX = frame.frameInfo.paddingX;
stPixelConvertParam.nPaddingY = frame.frameInfo.paddingY;
stPixelConvertParam.eBayerDemosaic = demosaicNearestNeighbor;
stPixelConvertParam.eDstPixelFormat = convertFormat;
stPixelConvertParam.pDstBuf = pDstBuf;
stPixelConvertParam.nDstBufSize = nDstBufSize;
ret = DLLPixelConvert(devHandle, &stPixelConvertParam);
if (IMV_OK == ret)
{
printf("image convert to %s successfully! nDstDataLen (%u)\n",
pConvertFormatStr, stPixelConvertParam.nDstBufSize);
memcpy(*data, pDstBuf, nDstBufSize);
w = frame.frameInfo.width;
h = frame.frameInfo.height;
// cv::Mat im(h, w, CV_8UC3, pDstBuf);
// cv::imwrite("/home/caowei/catkin_ws/output1.png", im);
// cv::imwrite("output1.png", im);
}
else
{
printf("image convert to %s failed! ErrorCode[%d]\n", pConvertFormatStr, ret);
}
if (pDstBuf)
{
free(pDstBuf);
pDstBuf = NULL;
}
return IMV_OK;
}
static void sendToRos(IMV_Frame frame)
{
IMV_FlipImageParam stFlipImageParam;
unsigned int nChannelNum = 0;
int ret = IMV_OK;
FILE* hFile = NULL;
memset(&stFlipImageParam, 0, sizeof(stFlipImageParam));
if (gvspPixelBGR8 == frame.frameInfo.pixelFormat)
{
stFlipImageParam.pSrcData = frame.pData;
stFlipImageParam.nSrcDataLen = frame.frameInfo.width * frame.frameInfo.height * BGR_CHANNEL_NUM;
stFlipImageParam.ePixelFormat = frame.frameInfo.pixelFormat;
nChannelNum = BGR_CHANNEL_NUM;
}
else
{
printf("image convert to BGR8 failed! ErrorCode[%d]\n", ret);
}
// 向ros发送/image消息
do
{
} while (false);
}
static int ret = IMV_OK;
static unsigned int cameraIndex = 0;
static IMV_HANDLE devHandle = NULL;
static void* libHandle = NULL;
static IMV_Frame frame;
static DLL_EnumDevices DLLEnumDevices = NULL;
static DLL_CreateHandle DLLCreateHandle = NULL;
static DLL_DestroyHandle DLLDestroyHandle = NULL;
static DLL_Open DLLOpen = NULL;
static DLL_AttachGrabbing DLLAttachGrabbing = NULL;
static DLL_StartGrabbing DLLStartGrabbing = NULL;
static DLL_StopGrabbing DLLStopGrabbing = NULL;
static DLL_Close DLLClose = NULL;
static DLL_GetFrame DLLGetFrame = NULL;
static DLL_ReleaseFrame DLLReleaseFrame = NULL;
static DLL_ClearFrameBuffer DLLClearFrameBuffer = NULL;
static DLL_ExecuteCommandFeature DLLExecuteCommandFeature = NULL;
static DLL_SetIntFeatureValue DLLSetIntFeatureValue = NULL;
static DLL_SetDoubleFeatureValue DLLSetDoubleFeatureValue = NULL;
int camera_init()
{
// Load SDK library
#ifdef _WIN32
libHandle = 0;
#else
libHandle = dlopen("libMVSDK.so", RTLD_LAZY);
#endif
if (NULL == libHandle)
{
printf("Load MVSDKmd.dll library failed!\n");
return IMV_ERROR;
}
// 获取发现设备接口函数地址
// Get discover camera interface address
DLLEnumDevices = (DLL_EnumDevices)dlsym(libHandle, "IMV_EnumDevices");
if (NULL == DLLEnumDevices)
{
printf("Get IMV_EnumDevices address failed!\n");
return IMV_ERROR;
}
// 获取发现设备接口函数地址
// Get discover camera interface address
//DLL_EnumDevices DLLEnumDevices = (DLL_EnumDevices)dlsym(libHandle, "IMV_EnumDevices");
//if (NULL == DLLEnumDevices)
//{
// printf("Get IMV_EnumDevices address failed!\n");
// return 0;
//}
// 获取创建设备句柄接口函数地址
// Get create Device Handle interface address
DLLCreateHandle = (DLL_CreateHandle)dlsym(libHandle, "IMV_CreateHandle");
if (NULL == DLLCreateHandle)
{
printf("Get IMV_CreateHandle address failed!\n");
return IMV_ERROR;
}
// 获取销毁设备句柄接口函数地址
// Get destroy Device Handle interface address
DLLDestroyHandle = (DLL_DestroyHandle)dlsym(libHandle, "IMV_DestroyHandle");
if (NULL == DLLDestroyHandle)
{
printf("Get IMV_DestroyHandle address failed!\n");
return IMV_ERROR;
}
// 获取打开相机接口函数地址
// Get open camera interface address
DLLOpen = (DLL_Open)dlsym(libHandle, "IMV_Open");
if (NULL == DLLOpen)
{
printf("Get IMV_Open address failed!\n");
return IMV_ERROR;
}
// 获取注册数据帧回调接口函数地址
// Get register data frame callback interface address
DLLAttachGrabbing = (DLL_AttachGrabbing)dlsym(libHandle, "IMV_AttachGrabbing");
if (NULL == DLLAttachGrabbing)
{
printf("Get IMV_AttachGrabbing address failed!\n");
return IMV_ERROR;
}
// 获取开始拉流接口函数地址
// Get start grabbing interface address
DLLStartGrabbing = (DLL_StartGrabbing)dlsym(libHandle, "IMV_StartGrabbing");
if (NULL == DLLStartGrabbing)
{
printf("Get IMV_StartGrabbing address failed!\n");
return IMV_ERROR;
}
// 获取停止拉流接口函数地址
// Get stop grabbing interface address
DLLStopGrabbing = (DLL_StopGrabbing)dlsym(libHandle, "IMV_StopGrabbing");
if (NULL == DLLStopGrabbing)
{
printf("Get IMV_StopGrabbing address failed!\n");
return IMV_ERROR;
}
// 获取
// 获取关闭相机接口函数地址
// Get close camera interface address
DLLClose = (DLL_Close)dlsym(libHandle, "IMV_Close");
if (NULL == DLLClose)
{
printf("Get IMV_Close address failed!\n");
return IMV_ERROR;
}
// 获取获取一帧图像函数地址
DLLGetFrame = (DLL_GetFrame)dlsym(libHandle, "IMV_GetFrame");
if (NULL == DLLGetFrame)
{
printf("Get IMV_GetFrame address failed!\n");
return IMV_ERROR;
}
DLLReleaseFrame = (DLL_ReleaseFrame)dlsym(libHandle, "IMV_ReleaseFrame");
if (NULL == DLLReleaseFrame)
{
printf("Get IMV_ReleaseFrame address failed!\n");
return IMV_ERROR;
}
DLLClearFrameBuffer = (DLL_ClearFrameBuffer)dlsym(libHandle, "IMV_ClearFrameBuffer");
if (NULL == DLLClearFrameBuffer)
{
printf("Get IMV_ClearFrameBuffer address failed!\n");
return IMV_ERROR;
}
DLLExecuteCommandFeature = (DLL_ExecuteCommandFeature)dlsym(libHandle, "IMV_ExecuteCommandFeature");
if (NULL == DLLExecuteCommandFeature)
{
printf("Get IMV_ExecuteCommandFeature address failed!\n");
return IMV_ERROR;
}
DLLSetIntFeatureValue = (DLL_SetIntFeatureValue)dlsym(libHandle, "IMV_SetIntFeatureValue");
if (NULL == DLLSetIntFeatureValue)
{
printf("Get IMV_SetIntFeatureValue address failed!\n");
return IMV_ERROR;
}
DLLSetDoubleFeatureValue = (DLL_SetDoubleFeatureValue)dlsym(libHandle, "IMV_SetDoubleFeatureValue");
if (NULL == DLLSetDoubleFeatureValue)
{
printf("Get IMV_SetDoubleFeatureValue address failed!\n");
return IMV_ERROR;
}
////////////////////// 检查接口结束
// 发现设备
// discover camera
IMV_DeviceList deviceInfoList;
ret = DLLEnumDevices(&deviceInfoList, interfaceTypeAll);
if (IMV_OK != ret)
{
printf("Enumeration devices failed! ErrorCode[%d]\n", ret);
return ret;
}
if (deviceInfoList.nDevNum < 1)
{
printf("no camera\n");
return IMV_ERROR;
}
// 打印相机基本信息(序号,类型,制造商信息,型号,序列号,用户自定义ID,IP地址
// Print camera info (Index, Type, Vendor, Model, Serial number, DeviceUserID, IP Address)
displayDeviceInfo(deviceInfoList);
// 选择需要连接的相机
// Select one camera to connect to
// cameraIndex = selectDevice(deviceInfoList.nDevNum);
cameraIndex = 0; // 第一个相机
// 创建设备句柄
// Create Device Handle
ret = DLLCreateHandle(&devHandle, modeByIndex, (void*)&cameraIndex);
if (IMV_OK != ret)
{
printf("Create devHandle failed! ErrorCode[%d]\n", ret);
return IMV_ERROR;
}
return IMV_OK;
}
int camera_start(int epx_time)
{
// 打开相机
ret = DLLOpen(devHandle);
if (IMV_OK != ret)
{
printf("Open camera failed! ErrorCode[%d]\n", ret);
return ret;
}
// 设置软触发模式
ret = setSoftTriggerConf(libHandle, devHandle);
if (IMV_OK != ret)
{
printf("setSoftTriggerConf failed! ErrorCode[%d]\n", ret);
return ret;
}
ret = DLLSetIntFeatureValue(devHandle, "Width", 9344);
if (IMV_OK != ret)
{
printf("Set feature value Width failed! ErrorCode[%d]\n", ret);
return ret;
}
ret = DLLSetIntFeatureValue(devHandle, "Height", 7000);
if (IMV_OK != ret)
{
printf("Set feature value Height failed! ErrorCode[%d]\n", ret);
return ret;
}
ret = DLLSetIntFeatureValue(devHandle, "OffsetX", 0);
if (IMV_OK != ret)
{
printf("Set feature value OffsetX failed! ErrorCode[%d]\n", ret);
return ret;
}
ret = DLLSetIntFeatureValue(devHandle, "OffsetY", 0);
if (IMV_OK != ret)
{
printf("Set feature value OffsetY failed! ErrorCode[%d]\n", ret);
return ret;
}
// 设置属性值曝光
// Set feature value
ret = DLLSetDoubleFeatureValue(devHandle, "ExposureTime", epx_time);
if (IMV_OK != ret)
{
printf("Set feature value failed! ErrorCode[%d]\n", ret);
return ret;
}
return IMV_OK;
}
int camera_cap(void** data, int& w, int& h, int time_out)
{
// 开始拉流
ret = DLLStartGrabbing(devHandle);
if (IMV_OK != ret)
{
printf("Start grabbing failed! ErrorCode[%d]\n", ret);
return 0;
}
// 清除帧数据缓存
ret = DLLClearFrameBuffer(devHandle);
if (IMV_OK != ret)
{
printf("Clear frame buffer failed! ErrorCode[%d]\n", ret);
return ret;
}
/////////////////////////获取一帧图像////////////////////////////
// 执行软触发
ret = DLLExecuteCommandFeature(devHandle, "TriggerSoftware");
if (IMV_OK != ret)
{
printf("Execute TriggerSoftware failed! ErrorCode[%d]\n", ret);
return ret;
}
// 获取一帧图像, TIMEOUT 5000ms
ret = DLLGetFrame(devHandle, &frame, time_out);
if (IMV_OK != ret && -101 != ret)
{
printf("Get frame failed! ErrorCode[%d]\n", ret);
return ret;
}
printf("width %d\n", frame.frameInfo.width);
printf("Height %d\n", frame.frameInfo.height);
ret = imageConvert(libHandle, devHandle, frame, gvspPixelBGR8, data, w, h);
if (IMV_OK != ret)
{
printf("imageConvert failed! ErrorCode[%d]\n", ret);
return ret;
}
// printf("11111111111111\n", ret);
// cv::Mat im(frame.frameInfo.height, frame.frameInfo.width, CV_8UC3, frame.pData);
// cv::imwrite("/home/caowei/catkin_ws/output.png", im);
// cv::imwrite("output.png", im);
// printf("22222222222222\n", ret);
// // 向ros送 /image消息
// sendToRos(frame);
// 释放图像缓存
ret = DLLReleaseFrame(devHandle, &frame);
if (IMV_OK != ret)
{
printf("Release frame failed! ErrorCode[%d]\n", ret);
return ret;
}
////////////////////////////////////////////////////////////////
// // 取图2秒
// // get frame 2 seconds
// sleep(2000);
// 停止拉流
// Stop grabbing
ret = DLLStopGrabbing(devHandle);
if (IMV_OK != ret)
{
printf("Stop grabbing failed! ErrorCode[%d]\n", ret);
return ret;
}
return IMV_OK;
}
int camera_stop()
{
// 关闭相机
// Close camera
ret = DLLClose(devHandle);
if (IMV_OK != ret)
{
printf("Close camera failed! ErrorCode[%d]\n", ret);
return 0;
}
// 销毁设备句柄
// Destroy Device Handle
if (NULL != devHandle)
{
// 销毁设备句柄
// Destroy Device Handle
DLLDestroyHandle(devHandle);
}
if (NULL != libHandle)
{
dlclose(libHandle);
}
printf("end...\n");
}
int main()
{
char* data = (char*)malloc(9344*7000*3);
int w, h;
ret = camera_init();
if (ret != IMV_OK) return ret;
ret = camera_start(12 * 10000);
if (ret != IMV_OK) return ret;
ret = camera_cap((void**) & data, w, h, 5000);
if (ret != IMV_OK) return ret;
cv::Mat im(h,w, CV_8UC3, data);
cv::imwrite("/home/caowei/catkin_ws/output.png", im);
cv::imwrite("output.png", im);
ret = camera_cap((void**) & data, w, h, 5000);
if (ret != IMV_OK) return ret;
cv::Mat im2(h,w, CV_8UC3, data);
cv::imwrite("/home/caowei/catkin_ws/output2.png", im2);
cv::imwrite("output2.png", im2);
camera_stop();
if (data)
free(data);
return 0;
}
//
//
//int main()
//{
// int ret = IMV_OK;
// unsigned int cameraIndex = 0;
// IMV_HANDLE devHandle = NULL;
// void* libHandle = NULL;
// DLL_DestroyHandle DLLDestroyHandle = NULL;
// IMV_Frame frame;
//
// // 加载SDK库
// // Load SDK library
//#ifdef _WIN32
// libHandle = 0;
//#else
// libHandle = dlopen("libMVSDK.so", RTLD_LAZY);
//#endif
//
// if (NULL == libHandle)
// {
// printf("Load MVSDKmd.dll library failed!\n");
// return 0;
// }
//
// // 获取发现设备接口函数地址
// // Get discover camera interface address
// DLLEnumDevices = (DLL_EnumDevices)dlsym(libHandle, "IMV_EnumDevices");
// if (NULL == DLLEnumDevices)
// {
// printf("Get IMV_EnumDevices address failed!\n");
// return 0;
// }
//
// // 获取创建设备句柄接口函数地址
// // Get create Device Handle interface address
// DLLCreateHandle = (DLL_CreateHandle)dlsym(libHandle, "IMV_CreateHandle");
// if (NULL == DLLCreateHandle)
// {
// printf("Get IMV_CreateHandle address failed!\n");
// return 0;
// }
//
// // 获取销毁设备句柄接口函数地址
// // Get destroy Device Handle interface address
// DLLDestroyHandle = (DLL_DestroyHandle)dlsym(libHandle, "IMV_DestroyHandle");
// if (NULL == DLLDestroyHandle)
// {
// printf("Get IMV_DestroyHandle address failed!\n");
// return 0;
// }
//
// // 获取打开相机接口函数地址
// // Get open camera interface address
// DLLOpen = (DLL_Open)dlsym(libHandle, "IMV_Open");
// if (NULL == DLLOpen)
// {
// printf("Get IMV_Open address failed!\n");
// return 0;
// }
//
// // 获取注册数据帧回调接口函数地址
// // Get register data frame callback interface address
// DLLAttachGrabbing = (DLL_AttachGrabbing)dlsym(libHandle, "IMV_AttachGrabbing");
// if (NULL == DLLAttachGrabbing)
// {
// printf("Get IMV_AttachGrabbing address failed!\n");
// return 0;
// }
//
// // 获取开始拉流接口函数地址
// // Get start grabbing interface address
// DLLStartGrabbing = (DLL_StartGrabbing)dlsym(libHandle, "IMV_StartGrabbing");
// if (NULL == DLLStartGrabbing)
// {
// printf("Get IMV_StartGrabbing address failed!\n");
// return 0;
// }
//
// // 获取停止拉流接口函数地址
// // Get stop grabbing interface address
// DLLStopGrabbing = (DLL_StopGrabbing)dlsym(libHandle, "IMV_StopGrabbing");
// if (NULL == DLLStopGrabbing)
// {
// printf("Get IMV_StopGrabbing address failed!\n");
// return 0;
// }
//
// // 获取
//
// // 获取关闭相机接口函数地址
// // Get close camera interface address
// DLLClose = (DLL_Close)dlsym(libHandle, "IMV_Close");
// if (NULL == DLLClose)
// {
// printf("Get IMV_Close address failed!\n");
// return 0;
// }
//
// // 获取获取一帧图像函数地址
// DLLGetFrame = (DLL_GetFrame)dlsym(libHandle, "IMV_GetFrame");
// if (NULL == DLLGetFrame)
// {
// printf("Get IMV_GetFrame address failed!\n");
// return 0;
// }
//
// DLLReleaseFrame = (DLL_ReleaseFrame)dlsym(libHandle, "IMV_ReleaseFrame");
// if (NULL == DLLReleaseFrame)
// {
// printf("Get IMV_ReleaseFrame address failed!\n");
// return 0;
// }
//
// DLLClearFrameBuffer = (DLL_ClearFrameBuffer)dlsym(libHandle, "IMV_ClearFrameBuffer");
// if (NULL == DLLClearFrameBuffer)
// {
// printf("Get IMV_ClearFrameBuffer address failed!\n");
// return 0;
// }
//
// DLLExecuteCommandFeature = (DLL_ExecuteCommandFeature)dlsym(libHandle, "IMV_ExecuteCommandFeature");
// if (NULL == DLLExecuteCommandFeature)
// {
// printf("Get IMV_ExecuteCommandFeature address failed!\n");
// return 0;
// }
//
// DLLSetIntFeatureValue = (DLL_SetIntFeatureValue)dlsym(libHandle, "IMV_SetIntFeatureValue");
// if (NULL == DLLSetIntFeatureValue)
// {
// printf("Get IMV_SetIntFeatureValue address failed!\n");
// return 0;
// }
//
// DLLSetDoubleFeatureValue = (DLL_SetDoubleFeatureValue)dlsym(libHandle, "IMV_SetDoubleFeatureValue");
// if (NULL == DLLSetDoubleFeatureValue)
// {
// printf("Get IMV_SetDoubleFeatureValue address failed!\n");
// return 0;
// }
//
//
//////////////////////// 检查接口结束
// // 发现设备
// // discover camera
// IMV_DeviceList deviceInfoList;
// ret = DLLEnumDevices(&deviceInfoList, interfaceTypeAll);
// if (IMV_OK != ret)
// {
// printf("Enumeration devices failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// if (deviceInfoList.nDevNum < 1)
// {
// printf("no camera\n");
// return 0;
// }
//
// // 打印相机基本信息(序号,类型,制造商信息,型号,序列号,用户自定义ID,IP地址
// // Print camera info (Index, Type, Vendor, Model, Serial number, DeviceUserID, IP Address)
//
// displayDeviceInfo(deviceInfoList);
// // 选择需要连接的相机
// // Select one camera to connect to
// // cameraIndex = selectDevice(deviceInfoList.nDevNum);
// cameraIndex = 0; // 第一个相机
//
// // 创建设备句柄
// // Create Device Handle
// ret = DLLCreateHandle(&devHandle, modeByIndex, (void*)&cameraIndex);
// if (IMV_OK != ret)
// {
// printf("Create devHandle failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// // 打开相机
// ret = DLLOpen(devHandle);
// if (IMV_OK != ret)
// {
// printf("Open camera failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// // 设置软触发模式
// ret = setSoftTriggerConf(libHandle, devHandle);
// if (IMV_OK != ret)
// {
// printf("setSoftTriggerConf failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// ret = DLLSetIntFeatureValue(devHandle, "Width", 9344);
// if (IMV_OK != ret)
// {
// printf("Set feature value Width failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
// ret = DLLSetIntFeatureValue(devHandle, "Height", 7000);
// if (IMV_OK != ret)
// {
// printf("Set feature value Height failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
// ret = DLLSetIntFeatureValue(devHandle, "OffsetX", 0);
// if (IMV_OK != ret)
// {
// printf("Set feature value OffsetX failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
// ret = DLLSetIntFeatureValue(devHandle, "OffsetY", 0);
// if (IMV_OK != ret)
// {
// printf("Set feature value OffsetY failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
// // 设置属性值曝光
// // Set feature value
// ret = DLLSetDoubleFeatureValue(devHandle, "ExposureTime", 12*10000);
// if (IMV_OK != ret)
// {
// printf("Set feature value failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
// // // 非多线程,不需要注册回调
// // // 注册数据帧回调函数
// // // Register data frame callback function
// // ret = DLLAttachGrabbing(devHandle, onGetFrame, NULL);
// // if (IMV_OK != ret)
// // {
// // printf("Attach grabbing failed! ErrorCode[%d]\n", ret);
// // return 0;
// // }
//
// // 开始拉流
// // Start grabbing
// ret = DLLStartGrabbing(devHandle);
// if (IMV_OK != ret)
// {
// printf("Start grabbing failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// /////////////////////////获取一帧图像////////////////////////////
//
// // 清除帧数据缓存
// // Clear frame buffer
// ret = DLLClearFrameBuffer(devHandle);
// if (IMV_OK != ret)
// {
// printf("Clear frame buffer failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
// // 执行软触发
// // Execute soft trigger
// ret = DLLExecuteCommandFeature(devHandle, "TriggerSoftware");
// if (IMV_OK != ret)
// {
// printf("Execute TriggerSoftware failed! ErrorCode[%d]\n", ret);
// return ret;
// }
//
//
// // 获取一帧图像, TIMEOUT 5000ms
// ret = DLLGetFrame(devHandle, &frame, 5000);
// if (IMV_OK != ret)
// {
// printf("Get frame failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// printf("width %d\n", frame.frameInfo.width);
// printf("Height %d\n", frame.frameInfo.height);
//
// ret = imageConvert(libHandle, devHandle, frame, gvspPixelBGR8);
// if (IMV_OK != ret)
// {
// printf("imageConvert failed! ErrorCode[%d]\n", ret);
// return 0;
// }
// // printf("11111111111111\n", ret);
// // cv::Mat im(frame.frameInfo.width, frame.frameInfo.height, CV_8UC3, frame.pData);
// // cv::imwrite("/home/caowei/catkin_ws/output.png", im);
// // cv::imwrite("output.png", im);
// // printf("22222222222222\n", ret);
// // // 向ros送 /image消息
// // sendToRos(frame);
//
// // 释放图像缓存
// ret = DLLReleaseFrame(devHandle, &frame);
// if (IMV_OK != ret)
// {
// printf("Release frame failed! ErrorCode[%d]\n", ret);
// return 0;
// }
// ////////////////////////////////////////////////////////////////
//
// // // 取图2秒
// // // get frame 2 seconds
// // sleep(2000);
//
// // 停止拉流
// // Stop grabbing
// ret = DLLStopGrabbing(devHandle);
// if (IMV_OK != ret)
// {
// printf("Stop grabbing failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// // 关闭相机
// // Close camera
// ret = DLLClose(devHandle);
// if (IMV_OK != ret)
// {
// printf("Close camera failed! ErrorCode[%d]\n", ret);
// return 0;
// }
//
// // 销毁设备句柄
// // Destroy Device Handle
// if (NULL != devHandle)
// {
// // 销毁设备句柄
// // Destroy Device Handle
// DLLDestroyHandle(devHandle);
// }
//
// if (NULL != libHandle)
// {
// dlclose(libHandle);
// }
//
// printf("end...\n");
// // getchar();
//
// return 0;
//}
}