微视图像(microview)gige相机开发手记(1)

导师丢给我个视频监控项目带界面、有算法功能...要我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;
};
}


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页