导师丢给我个视频监控项目带界面、有算法功能...要我3个月内弄完.....我第一次接触这种千兆网络相机啊喂........
本所有教程均采用vs2012编程。看本手记前请把相关驱动安装好,墙裂建议去游民星空下个游戏环境懒人包安装一遍...
一、配置
1)新建一个工程
2) 将SDK中的lib,头文件、放到你编写源代码时同一级的文件夹下(MVC_API.lib、MVCAPI.h、MVC_Common.h)将dll文件(貌似SDKAPI文件夹里没给dll文件,直接去BIN32或者BIN64文件夹偷去好了)放到编译生成的.exe同级文件夹下(我就是懒得配置了怎么地)。
这样一个工程的基本配置就解决了。
二、关于网卡、巨帧以及其他
貌似MVCGIGE比较挑网卡,我电脑原装的realtek网卡第一次连能连上后来就连不上了,之后给厂家打电话厂家推荐使用intel千兆网卡,如果使用多台相机连接交换机的话推荐使用千兆网级的交换机(然而我只有一个小路由器...)。所以有条件的最好上intel 千兆级独立网卡。
这个相机默认是开启巨帧的(jambo frames)而大多数网卡默认是关闭巨帧的....所以使用时要先把网卡的巨帧打开。
具体步骤:
网络(网上邻居?)/本地连接/属性/配置/高级/找到巨型帧/选择9bit(最大的那个)。
然而,我的realtek网卡即使开了巨型帧仍然不行....可能是网卡不支持巨帧?
所以在编程之前最好先用官方的测试程序测试下,相机能否正常工作,在MVCTest里可以将相机的巨帧关掉的。
三、最小例程
官方的例子都是基于mfc的...而且代码量比较大....于是我精简了一下...用于测试摄像头是否工作。
#include<Windows.h>//是的,这个相机就是这么依赖平台
#include"MVCAPI.h"
#include<opencv2\core\core.hpp>//opencv要先配置好了哦
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
int main(){
DWORD ulDeviceNumber= MVC_GetDeviceNumber();
MVCGE_DEVLISTEX device0Info,device1Info;
std::cout<<MVC_GetDeviceInfoEx(0,&device0Info)<<std::endl;
std::cout<<CY_RESULT_OK<<std::endl;
MVC_GetDeviceInfoEx(1,&device1Info);
std::cout<<"online device number:"<<ulDeviceNumber<<std::endl;
std::cout<<"cam0: ip:"<<device0Info.DevIP<<"Mac:"<<device0Info.DevMAC<<"name:"<<device0Info.DevName<<std::endl;
std::cout<<"cam1: ip:"<<device1Info.DevIP<<"Mac:"<<device1Info.DevMAC<<"name:"<<device1Info.DevName<<std::endl;
std::cout<<"connecting device......."<<std::endl;
int m_iImgWidth = 800;
int m_iImgHeight =600;
MVCFRAMEINFO cam1frameInfo,cam0frameInfo;
memset(&cam0frameInfo,0,sizeof(MVCFRAMEINFO));
memset(&cam1frameInfo,0,sizeof(MVCFRAMEINFO));//我也不知道干嘛使的,反正没有就读不出来
MVC_SetNetPacketSize(0,1440);//不开启巨帧;在opendevice之前调用.重要!!!
MVC_SetNetPacketSize(1,1440);
if(MVC_OpenDevice(0)==CY_RESULT_OK)
std::cout<<"打开cam0成功";
if(MVC_OpenDevice(1)==CY_RESULT_OK)
std::cout<<"打开cam1成功";
MVC_SetParameter(0,MVCADJ_SHUTTERTYPE,1); //设置采集模式为连续采集模式(面阵相机)
MVC_SetParameter(0,MVCADJ_BITMODE, 2); //设置为10bit 采集
MVC_SetParameter(0,MVCADJ_WIDTH,m_iImgWidth); //采集的宽度为800(假定最大可设1280)
MVC_SetParameter(0,MVCADJ_HEIGHT, m_iImgHeight); //采集的高度为600(假定最大可设1024)
MVC_SetParameter(1,MVCADJ_SHUTTERTYPE,1); //设置采集模式为连续采集模式(面阵相机)
MVC_SetParameter(1,MVCADJ_BITMODE, 2); //设置为10bit 采集
MVC_SetParameter(1,MVCADJ_WIDTH,m_iImgWidth); //采集的宽度为800(假定最大可设1280)
MVC_SetParameter(1,MVCADJ_HEIGHT, m_iImgHeight); //采集的高度为600(假定最大可设1024)
std::cout<<"try to get a image data:"<<std::endl;
#if 1
while ( 1){
MVC_EnableCapture(0);
MVC_EnableCapture(1);
MVC_GetRgbData3(0,&cam1frameInfo);
MVC_GetRgbData3(1,&cam0frameInfo);
cv::Mat img(600,800,CV_8UC3, cam1frameInfo.lBufPtr);
cv::Mat img1(600,800,CV_8UC3, cam0frameInfo.lBufPtr);
cv::imshow("1",img);
cv::imshow("2",img1);
cv::waitKey(1);
}
}
看着长,主要是因为我接了两个相机,读两个相机的数据。相关函数可以在SDK使用说明中找到。
(完)
PS:
我将这个相机的相关函数封装了下,编成了一个类似于opencv中videocapture类的类..有人愿意试试么..
头文件:
#include<opencv2\core\core.hpp>
class string;
namespace cv{
class MVCVideoCapture
{
public:
typedef size_t CamNumber;
MVCVideoCapture(CamNumber,DWORD&status);
MVCVideoCapture();
MVCVideoCapture(CamNumber,DWORD&status,DWORD img_Height,DWORD img_Width,bool jamboframe);
~MVCVideoCapture(void);
virtual bool isOpened();
virtual DWORD open(CamNumber);
virtual DWORD open(CamNumber,DWORD img_Height,DWORD img_Width,bool jamboframe);
virtual DWORD release();
virtual DWORD enableCapture();//开启帧捕获,在捕捉帧之前必须调用。
virtual DWORD closeCapture();//关闭帧捕获。
virtual DWORD read(Mat &image);
virtual MVCVideoCapture& operator >> (Mat& image);
virtual MVCGE_DEVLISTEX getCamInfo();//获取相机基本信息
virtual MVCVideoCapture *getIP(string &);//获取相机的IP地址
virtual MVCVideoCapture *getSubnetMask(string &);//获取相机的子网掩码
virtual MVCVideoCapture *getGateWayAddress(string &);//获取相机的网关地址
protected:
virtual DWORD initialize();
virtual void del();
MVCGE_DEVLISTEX* camInfo;
MVCFRAMEINFO MVCframe;
DWORD frame_WIDTH;
DWORD frame_HEIGHT;
CamNumber deviceNumber;
bool OpenJamboFrame;
};
}