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

来源:互联网 发布:智能家居控制系统c语言 编辑:程序博客网 时间:2024/05/16 08:11




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-100imencode(".bmp", frame, buff, param);//CV_IMWRITE_JPEG_QUALITYlen = 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")#endifstatic 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);*/



0 0