微视 千兆网相机 C++开发 opencv

导师丢给我个视频监控项目带界面、有算法功能...要我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的...而且代码量比较大....于是我精简了一下...用于测试摄像头是否工作。

[cpp] view plain copy
#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类的类..有人愿意试试么..

头文件:

[cpp] view plain copy
#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;  
};  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值