大恒工业相机usb2.0简易开发(一)
前言
由于官方的sdk里的sample并没有详细写结合opencv开发的一些内容,在此做下入门记录,目标是在clion环境下,实时输出视频小窗。
另外,在使用过程中,发现GxRegisterCaptureCallback
(注册回调函数)和GxUnregisterCaptureCallback
(注销回调函数)不能用,不知道为什么,待解决,在之后的代码中我是用GxGetImage
来写的
最终效果:
clion配置
官方的sdk中只有makefile的配置,可以根据此来改写成cmakelist配置,代码如下:
cmake_minimum_required(VERSION 3.5)
project(GX_myJob_usb2_0)
set(CMAKE_CXX_STANDARD 14)
# 相机要加的编译部分
set(CMAKE_EXE_LINKER_FLAGS
-I$(GENICAM_ROOT_V2_3)/library/CPP/include
-I$(DAHENG_ROOT)/sdk/include
)
# 寻找必要依赖库
find_package(OpenCV 4 REQUIRED)
# 设置头文件目录
include_directories(${
OpenCV_INCLUDE_DIRS})
# 添加可执行文件以及链接
add_executable(GX_myJob_usb2_0 main.cpp)
target_link_libraries(GX_myJob_usb2_0 ${
OpenCV_LIBS})
target_link_libraries(GX_myJob_usb2_0
-ldhgentl -lgxiapi -ldximageproc -lpthread
-L$(GENICAM_ROOT_V2_3)/bin/Linux64_x64
-L$(GENICAM_ROOT_V2_3)/bin/Linux64_x64/GenApi/Generic)
其中-ldhgentl -lgxiapi -ldximageproc -lpthread
是必须加的,其他我删掉也没啥问题,但以防万一全加上了。
主函数代码
在下面 ProcGetImage
函数中写图像处理的部分即可,有很多函数在这里没用到(比如保存为PPM文件等),重点在 ProcGetImage
中。
如果要用cmake的话,得把sdk里的DxImageProc.h
和GxIAPI.h
也给拉进项目里。
#include "GxIAPI.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include "DxImageProc.h"
#include "CTimeCounter.h"
using namespace std;
using namespace cv;
GX_DEV_HANDLE g_hDevice = NULL; ///< 设备句柄
GX_FRAME_DATA g_frameData; ///< 采集图像参数
pthread_t g_hThreadAcq; ///< 采集线程
bool g_bGetImg = false; ///< 采集线程是否结束的标志:true 运行;false 退出
int32_t g_nImageSize = 0; ///< 图像大小
void *g_pRaw8Buffer = NULL; ///< 将非8位raw数据转换成8位数据的时候的中转缓冲buffer
void *g_pRGBframeData = NULL; ///< RAW数据转换成RGB数据后的存储空间,大小是相机输出数据大小的3倍
int64_t g_nPixelFormat = GX_PIXEL_FORMAT_BAYER_GR8; ///< 当前相机的pixelformat格式
int64_t g_nColorFilter = GX_COLOR_FILTER_NONE; ///< bayer插值的参数
void *g_pframeInfoData = NULL; ///< 帧信息数据缓冲区
size_t g_nframeInfoDataSize = 0; ///< 帧信息数据长度
CTimeCounter g_objTimeCounter; ///< 计时器
Mat test; ///< 显示的图像
//查询固件版本号
void PrintFirmwareVersion(GX_FEATURE_ID featureID);
//查询FPGA版本号
void PrintFPGAVersion(GX_FEATURE_ID featureID);
//获取图像大小并申请图像数据空间
void PreGetImage();
//释放资源
void UnPreGetImage();
//采集线程函数
void *ProcGetImage(void* pParam);
//保存数据到PPM文件
void SavePPMFile(void *pImgBuffer, int32_t nWidth, int32_t nHeight);
//保存raw数据文件
void SaveRawFile(void *pImgBuffer, int32_t nWidth, int32_t nHeight);
//将相机输出的原始数据转换为RGB数据
void ProcessData(void * pImageBuf, void * pImageRaw8Buf, void * pImageRGBBuf, int nImageWidth, int nImageHeight, int nPixelFormat, int nPixelColorFilter);
//获取当前帧号
int GetCurFrameIndex();
//打印一个Mat矩阵
void PrintMat(Mat A)
{
for(int i=0;i<A.rows;i++)
{
for(int j=0;j<A.cols;j++)
cout<<A.at<float>(i,j