1174 lines
30 KiB
C++
1174 lines
30 KiB
C++
#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);
|
||
|
||
// 相机的设备类型(GigE,U3V,CL,PCIe)
|
||
// 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 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 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 mode to On
|
||
ret = DLLSetEnumFeatureSymbol(devHandle, "TriggerMode", "Off");
|
||
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 -999;
|
||
}
|
||
|
||
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 -998;
|
||
}
|
||
|
||
// 图像转换成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, stPixelConvertParam.pDstBuf, stPixelConvertParam.nHeight * stPixelConvertParam.nWidth * 3);
|
||
printf("memcpy success! %d - %d - %d \n", *data, stPixelConvertParam.nHeight, stPixelConvertParam.nWidth);
|
||
w = stPixelConvertParam.nWidth;
|
||
h = stPixelConvertParam.nHeight;
|
||
// 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 ret;
|
||
}
|
||
|
||
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;
|
||
|
||
// static int setGrabMode(IMV_HANDLE devHandle, bool isContious)
|
||
// {
|
||
// int ret = IMV_OK;
|
||
|
||
// // 设置触发器
|
||
// // Set trigger selector to FrameStart
|
||
// ret = IMV_SetEnumFeatureSymbol(devHandle, "TriggerSelector", "FrameStart");
|
||
// if (IMV_OK != ret)
|
||
// {
|
||
// printf("Set triggerSelector value failed! ErrorCode[%d]\n", ret);
|
||
// return ret;
|
||
// }
|
||
|
||
// if (isContious)
|
||
// {
|
||
// // 关闭触发模式
|
||
// // Set trigger mode to Off
|
||
// ret = IMV_SetEnumFeatureSymbol(devHandle, "TriggerMode", "Off");
|
||
// if (IMV_OK != ret)
|
||
// {
|
||
// printf("Set triggerMode value failed! ErrorCode[%d]\n", ret);
|
||
// return ret;
|
||
// }
|
||
// }
|
||
// else
|
||
// {
|
||
// // 设置触发源为软触发
|
||
// // Set trigger source to Software
|
||
// ret = IMV_SetEnumFeatureSymbol(devHandle, "TriggerSource", "Software");
|
||
// if (IMV_OK != ret)
|
||
// {
|
||
// printf("Set triggerSource value failed! ErrorCode[%d]\n", ret);
|
||
// return ret;
|
||
// }
|
||
|
||
// // 设置触发模式
|
||
// // Set trigger mode to On
|
||
// ret = IMV_SetEnumFeatureSymbol(devHandle, "TriggerMode", "On");
|
||
// if (IMV_OK != ret)
|
||
// {
|
||
// printf("Set triggerMode value failed! ErrorCode[%d]\n", ret);
|
||
// return ret;
|
||
// }
|
||
// }
|
||
|
||
// return ret;
|
||
// }
|
||
|
||
int camera_init()
|
||
{
|
||
int ret = IMV_OK;
|
||
// Load SDK library
|
||
#ifdef _WIN32
|
||
libHandle = 0;
|
||
#else
|
||
printf("Load MVSDKmd.so!\n");
|
||
libHandle = dlopen("libMVSDK.so", RTLD_LAZY);
|
||
#endif
|
||
if (NULL == libHandle)
|
||
{
|
||
printf("Load MVSDKmd.so 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 ret;
|
||
}
|
||
|
||
int camera_start(int epx_time)
|
||
{
|
||
int ret = IMV_OK;
|
||
|
||
// 打开相机
|
||
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;
|
||
}
|
||
|
||
// // 设置软触发模式
|
||
// ret = setGrabMode(devHandle, false);
|
||
// if (IMV_OK != ret)
|
||
// {
|
||
// printf("Set grabbing mode failed! ErrorCode[%d]\n", ret);
|
||
// return ret;
|
||
// }
|
||
|
||
// 开始拉流
|
||
ret = DLLStartGrabbing(devHandle);
|
||
if (IMV_OK != ret)
|
||
{
|
||
printf("Start grabbing failed! ErrorCode[%d]\n", ret);
|
||
return ret;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
|
||
int camera_cap(void** data, int& w, int& h, int time_out)
|
||
{
|
||
int ret = IMV_OK;
|
||
sleep(500);
|
||
// 清除帧数据缓存
|
||
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;
|
||
// }
|
||
|
||
// sleep(500);
|
||
|
||
// 获取一帧图像, TIMEOUT 5000ms
|
||
ret = DLLGetFrame(devHandle, &frame, time_out);
|
||
// ret = DLLGetFrame(devHandle, &frame, 5000);
|
||
// if (IMV_OK != ret && -101 != ret)
|
||
if (IMV_OK != 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;
|
||
}
|
||
sleep(500);
|
||
////////////////////////////////////////////////////////////////
|
||
|
||
// // 取图2秒
|
||
// // get frame 2 seconds
|
||
// sleep(2000);
|
||
// 停止拉流
|
||
// Stop grabbing
|
||
|
||
// 等待流碎片走完
|
||
// sleep(2000);
|
||
}
|
||
|
||
int camera_stop()
|
||
{
|
||
int ret = IMV_OK;
|
||
ret = DLLStopGrabbing(devHandle);
|
||
if (IMV_OK != ret)
|
||
{
|
||
printf("Stop grabbing failed! ErrorCode[%d]\n", ret);
|
||
return ret;
|
||
}
|
||
return ret;
|
||
|
||
|
||
// 关闭相机
|
||
// Close camera
|
||
ret = DLLClose(devHandle);
|
||
if (IMV_OK != ret)
|
||
{
|
||
printf("Close camera failed! ErrorCode[%d]\n", ret);
|
||
return ret;
|
||
}
|
||
|
||
// 待修改
|
||
|
||
// 销毁设备句柄
|
||
// Destroy Device Handle
|
||
if (NULL != devHandle)
|
||
{
|
||
// 销毁设备句柄
|
||
// Destroy Device Handle
|
||
DLLDestroyHandle(devHandle);
|
||
}
|
||
|
||
if (NULL != libHandle)
|
||
{
|
||
dlclose(libHandle);
|
||
}
|
||
|
||
// printf("end...\n");
|
||
return ret;
|
||
}
|
||
|
||
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;
|
||
|
||
int index = 5;
|
||
while (true)
|
||
{
|
||
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);
|
||
index --;
|
||
if (index == 0)
|
||
break;
|
||
}
|
||
|
||
// 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 ret;
|
||
}
|
||
//
|
||
//
|
||
//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;
|
||
//}
|
||
|
||
} |