Win10 下使用Microview相机SDK进行二次开发
注意事项
Microview SDK是在XP下开发得到,在Win10下编译得到的可执行文件需用管理员权限运行,可以设置为兼容 XP 模式运行,若编译成 dll,那么调用该 dll 的程序需要有管理员权限,比如编译成 mex 文件和 Matlab 混合编程时
亲测SDK64位版本不能用,请使用32位版本
亲测 Microview 号称的通过配置文件控制相机初始化顺序的功能无效,若有人成功了请告知
最简程序
该程序实现一个相机服务端功能,当客户端发来请求时,获取单帧图像并发送给客户端,以下是关键代码
//用到的一些变量
SOCKET m_sock;
SOCKET clientSocket;
HANDLE m_hMVCs[5];
BYTE* m_pRawDatas[5];
struct CapInfoStruct m_CapInfos[5];
DWORD RawDataSize;
int m_height,m_width,m_hOff,m_vOff;
/**
*初始化相机
**/
int CServerNet::InitCamera(){
int nIndex=0;
int rt;
for (nIndex=0;nIndex<CAMERA_NUM;++nIndex){
m_pRawDatas[nIndex]=(BYTE*)malloc(RawDataSize*sizeof(BYTE));
memset(m_pRawDatas[nIndex],0,RawDataSize);
struct CapInfoStruct *m_pCapInfo = &m_CapInfos[nIndex];
memset(m_pCapInfo, 0, sizeof(CapInfoStruct));
m_pCapInfo->Buffer = m_pRawDatas[nIndex];
m_pCapInfo->Height = m_height;
m_pCapInfo->Width = m_width;
m_pCapInfo->HorizontalOffset = m_hOff;
m_pCapInfo->VerticalOffset = m_vOff;
m_pCapInfo->Exposure = 1024;
m_pCapInfo->Gain[0] = 17;
m_pCapInfo->Gain[1] = 9;
m_pCapInfo->Gain[2] = 15;
m_pCapInfo->Control = 0;
memset(m_pCapInfo->Reserved, 0, 8);
m_pCapInfo->Reserved[0] = 3;
m_hMVCs[nIndex] = 0;
rt = MV_Usb2Init("MVC1000", &nIndex, m_pCapInfo, &m_hMVCs[nIndex]);
if(ResSuccess != rt)
{
printf("Can not open USB camera!\n");
MV_Usb2Uninit(&m_hMVCs[nIndex]);
m_hMVCs[nIndex] = NULL;
return 1;
}else{
MV_Usb2StartCapture(m_hMVCs[nIndex],TRUE);
}
}
return 0;
}
/**
*去初始化相机
*如果不进行去初始化,那么在程序关闭前其他程序都无法使用相机
**/
int CServerNet::UInitCamera(){
for (int i=0;i<CAMERA_NUM;++i){
MV_Usb2StartCapture(m_hMVCs[i],FALSE);
MV_Usb2Uninit(&m_hMVCs[i]);
}
return 0;
}
/**
*获取图像并发送给客户端
**/
int CServerNet::TransImage(){
int iErrMsg;
printf("Get RawData\n");
for (int nIndex=0;nIndex<CAMERA_NUM;++nIndex){
MV_Usb2GetRawData(m_hMVCs[nIndex],&m_CapInfos[nIndex]);
}
printf("TransImage start\n");
for (int nIndex=0;nIndex<CAMERA_NUM;++nIndex){
iErrMsg = send(clientSocket,(char*)m_pRawDatas[nIndex],m_height*m_width,0);
if (iErrMsg < 0){
//发送失败
printf("send msg failed with error : %d\n",iErrMsg);
return 1;
}
}
printf("TransImage finish\n");
return 0;
}