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

原文:http://blog.csdn.net/qq_27582707/article/details/51524231

导师丢给我个视频监控项目带界面、有算法功能...要我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]   
#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]   
#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;    
};    
}    
posted @ 2017-09-22 13:40  东南坼  阅读(481)  评论(0编辑  收藏  举报