define.h
#ifndef CV_H
#define CV_H
#include <windows.h>
#include <omp.h>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\video\video.hpp>
#include "tisgrabber.h"
using namespace cv;
using namespace std;
void init_cv();
void exit_cv();
void camera_init();
string get_name_val(UINT8 *data, int offset);
string get_name_val(UINT8 *data);
class CAMINFO
{
public:
CAMINFO(void)
{
hGrabber = NULL;
}
public:
cv::VideoCapture cap;
string name;
int company; //相机品牌
int uid; //识别码
double f_rate; //帧率
double shutter; //快门
double gain; //增益
double resolution; //分辨率
double luminance; //亮度
int ext_trig; //外部触发
//TIS参数
HGRABBER hGrabber;
};//CAMINFO;
typedef list<CAMINFO*> LISTCAM;
bool cmp_strs(string s1, string s2);
#define CAM_CV (0) //系统默认
#define CAM_TIS (1) //映美精
void cam_tis_open(CAMINFO *cam);
void cam_cv_open(CAMINFO *cam);
Mat cam_cv_snap(CAMINFO *cam);
Mat cam_tis_snap(CAMINFO *cam);
void cam_cv_close(CAMINFO *cam);
void cam_tis_close(CAMINFO *cam);
int cam_tis_num();
int cam_cv_num();
void cam_tis_init();
void cam_tis_exit();
void camera_exit();
#endif
#include "define.h"
/*
摄像机图像获取
*/
static LISTCAM caps;
static CAMINFO* camera_find(string name)
{
LISTCAM::iterator idx;
CAMINFO *c;
if(caps.size() < 1)
return NULL;
for(idx = caps.begin(); idx != caps.end(); ++idx)
{
c = *idx;
if(cmp_strs(name, c->name))
return c;
}
return NULL;
}
static CAMINFO* camera_check(UINT8 *name1)
{
CAMINFO *cam;
string name;
name = get_name_val(name1);
cam = camera_find(name);
if(NULL == cam)
return NULL;
return cam;
}
void camera_init()
{
cam_tis_init();
}
//上位机退出时调用
void camera_exit()
{
CAMINFO *cam;
LISTCAM::iterator idx;
if(caps.size() < 1)
return;
for(idx = caps.begin(); idx != caps.end(); ++idx)
{
cam = *idx;
if(NULL != cam)
{
if(CAM_CV == cam->company)
{
cam_cv_close(cam);
}
else if (CAM_TIS == cam->company)
{
cam_tis_close(cam);
}
}
delete cam;
}
cam_tis_exit();
}
int camera_set(UINT8* camera_name, double *config)
{
CAMINFO *cam;
string name;
bool flag = false;
int cnt = 0;
name = get_name_val(camera_name);
cam = camera_find(name);
if(NULL == cam)
{
cam = new CAMINFO();
flag = true;
}
cam->name = name;
cam->company = (int)(config[cnt++]);
cam->uid = (int)config[cnt++];
cam->f_rate = config[cnt++];
cam->shutter = config[cnt++];
cam->gain = config[cnt++];
cam->resolution = config[cnt++];
cam->luminance = config[cnt++];
cam->ext_trig = (int)config[cnt++];
if(flag)
caps.push_back(cam);
//直接打开相机
if(CAM_CV == cam->company)
{
cam_cv_open(cam);
}
else if (CAM_TIS == cam->company)
{
cam_tis_open(cam);
}
return 0;
}
//相机抓图
int camera_snap(UINT8* camera_name, UINT8* buff_data, int buff_len)
{
CAMINFO *cam = camera_check(camera_name);
if(NULL == cam)
return 0;
Mat frame;
vector<int> param = vector<int>(2);
int len;
if(CAM_CV == cam->company)
{
frame = cam_cv_snap(cam);
}
else if (CAM_TIS == cam->company)
{
frame = cam_tis_snap(cam);
}
else
{
return -1;
}
vector<uchar> buff;
param[0] = CV_IMWRITE_JPEG_QUALITY;
param[1] = 95;//default(95) 0-100
imencode(".bmp", frame, buff, param);//CV_IMWRITE_JPEG_QUALITY
len = buff.size();
if(len > buff_len)
return len;
uchar *p = &buff[0];
//memcpy(buff_data, buff, len);
for (int idx = 0; idx < len; idx++)
{
buff_data[idx] = buff[idx];
}
return len;
}
#include "define.h"
void cam_cv_open(CAMINFO *cam)
{
if(cam->cap.isOpened())
return;
try
{
cam->cap.open(cam->company);
}
catch (Exception ex)
{
}
}
Mat cam_cv_snap(CAMINFO *cam)
{
Mat frame;
cam_cv_open(cam);
if(!cam->cap.isOpened())
return frame;
if(!cam->cap.read(frame))
return frame;
//Mat result;
//cv::cvtColor(frame, result, CV_BGR2GRAY);
return frame;
}
void cam_cv_close(CAMINFO *cam)
{
try
{
if(cam->cap.isOpened())
{
cam->cap.release();
}
}
catch (Exception ex)
{
}
}
dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include "define.h"
//文件放Windows系统目录
#ifdef DEBUG
#pragma comment(lib, "opencv_core246d.lib")
#pragma comment(lib, "opencv_highgui246d.lib")
#pragma comment(lib, "opencv_imgproc246d.lib")
#pragma comment(lib, "opencv_video246d.lib")
#else
#pragma comment(lib, "opencv_core246.lib")
#pragma comment(lib, "opencv_highgui246.lib")
#pragma comment(lib, "opencv_imgproc246.lib")
#pragma comment(lib, "opencv_video246.lib")
#endif
//初始化
void cv_init()
{
camera_init();
}
//程序退出时调用
void env_exit()
{
camera_exit();
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
cv_init();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
//env_exit();
break;
}
return TRUE;
}
string get_name_val(UINT8 *data)
{
string str;
int idx;
str.clear();
for (idx = 0; idx < 32; idx++)
{
str.append(1, data[idx]);
}
return str;
}
static int get_str_len(string s)
{
int len1 = (int)s.length();
int idx;
for (idx = 0; idx < len1; idx++)
{
if(0 == s.at(idx))
return idx;
}
return idx;
}
bool cmp_strs(string s1, string s2)
{
int len1 = get_str_len(s1);
int len2 = get_str_len(s2);
if(len1 != len2)
return false;
int idx;
for (idx = 0; idx < len1; idx++)
{
if(s1.at(idx) != s2.at(idx))
return false;
}
return true;
}
CamITS.cpp
#include "define.h"
//映美睛相机驱动 theimagingsource
#ifdef WIN64
#pragma comment(lib, "tisgrabber_x64.lib")
#else
#pragma comment(lib, "tisgrabber.lib")
#endif
static int lib_init = IC_ERROR;
static int cam_num = 0; //相机数量
void cam_tis_open(CAMINFO *cam)
{
if(0 == cam_num)
cam_num = IC_GetDeviceCount();
if(cam->uid >= cam_num)
return;
if(NULL == cam->hGrabber)
cam->hGrabber = IC_CreateGrabber();
if(NULL == cam->hGrabber)
return;
int ret;
ret = IC_OpenVideoCaptureDevice(cam->hGrabber, IC_GetDevice((int)(cam->uid)));
ret = IC_SetVideoFormat(cam->hGrabber,"Y800 (640x480)"); //分辨率 resolution
//ret = IC_SetFormat(cam->hGrabber, Y800); 有问题
ret = IC_SetVideoProperty(cam->hGrabber, PROP_VID_BRIGHTNESS, (long)cam->luminance);
ret = IC_SetVideoProperty(cam->hGrabber, PROP_VID_GAIN, (long)cam->gain);
ret = IC_SetFrameRate(cam->hGrabber, cam->f_rate); //帧率
ret = IC_SetCameraProperty(cam->hGrabber, PROP_CAM_EXPOSURE, (long)cam->shutter);//快门
//IC_StartLive(cam->hGrabber, 0);
}
Mat cam_tis_snap(CAMINFO *cam)
{
if(IC_SUCCESS != lib_init)
return Mat();
cam_tis_open(cam);
IC_StartLive(cam->hGrabber, 0);
IC_SnapImage(cam->hGrabber, 2000); // Snap a frame into memory
//IC_SaveImage(cam->hGrabber, "Test.bmp",FILETYPE_BMP, 90);
long width, height;
int bits;
COLORFORMAT format;
UINT8 *data;
IC_GetImageDescription(cam->hGrabber, &width, &height, &bits, &format);
data = IC_GetImagePtr(cam->hGrabber); //在bmp文件的0x436开始
//Mat result;
if(Y800 == format)
{
Mat iMat(height, width, CV_8UC1, data);
return iMat;
//cv::cvtColor(iMat, result, CV_BGR2GRAY);
}
else if(RGB24 == format)
{
Mat iMat(height, width, CV_8UC3, data);
return iMat;
//cv::cvtColor(iMat, result, CV_BGR2GRAY);
}
else
{
Mat iMat;
return iMat;
}
}
void cam_tis_close(CAMINFO *cam)
{
if(IC_SUCCESS != lib_init)
return;
if(NULL == cam->hGrabber)
return;
// if(NULL != cam->show_handle)
// {
// cam->stop_cmd = true;
// while(cam->stop_cmd)
// Sleep(10);
// }
// else
{
IC_CloseVideoCaptureDevice(cam->hGrabber);
IC_ReleaseGrabber(&(cam->hGrabber));
cam->hGrabber = NULL;
}
}
void cam_tis_init()
{
lib_init = IC_InitLibrary(0);
if(IC_SUCCESS != lib_init)
return;
}
void cam_tis_exit()
{
if(IC_SUCCESS != lib_init)
return;
IC_CloseLibrary();
}
int cam_tis_num()
{
if(0 == cam_num)
cam_num = IC_GetDeviceCount();
return cam_num;
}
/*
typedef struct SSICGrab SICGrab;
struct SSICGrab{
HGRABBER hGrabber;
int iDeviceCount;
int iHeight;
int iWidth;
int iBitsPerPixel;
unsigned char *pucImageData;
COLORFORMAT ColorFormat;
int iProcessing;
};
void _cdecl callback(HGRABBER hGrabber, unsigned char* pData, unsigned long frameNumber, void* Data)
{
SICGrab *psICGrabCB;
psICGrabCB = (SICGrab *)Data;
int w = psICGrabCB->iWidth;
}
SICGrab *psICGrab;
psICGrab = (SICGrab*)calloc(1,sizeof(SICGrab));
psICGrab->hGrabber = hGrabber;
iResult = IC_SetFrameReadyCallback (hGrabber, *callback, psICGrab);
*/