【OpenCV】***映美精相机应用开发




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


Camera.cpp
#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;
}


CamCV.cpp
#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);
*/



  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值