Dll调用 海康威视网络摄像头

By cuiqbo at 2021-06-12 • 1人收藏 • 1182人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
OpenBtn={cls="button";text="打开";left=542;top=67;right=647;bottom=114;z=3};
S_G_Btn={cls="button";text="开始采集";left=549;top=133;right=654;bottom=180;z=6};
button={cls="button";text="Button";left=600;top=262;right=676;bottom=328;z=7};
button2={cls="button";text="Button";left=645;top=360;right=739;bottom=396;z=8};
closeBtn={cls="button";text="关闭";left=654;top=68;right=742;bottom=112;z=5};
diverListComBox={cls="combobox";left=12;top=6;right=524;bottom=32;edge=1;items={};mode="dropdown";z=4};
emBtn={cls="button";text="枚举";left=541;top=4;right=646;bottom=51;z=1};
picturebox={cls="picturebox";left=9;top=57;right=514;bottom=454;z=2}
)
/*}}*/

var dll = raw.loadDll("~\MvCameraControl.dll");
MV_CC_EnumDevices= dll.api("MV_CC_EnumDevices","INT (INT nTLayerType,  struct& pstDevList)");

MV_MAX_GENTL_IF_NUM = 256;
MV_MAX_DEVICE_NUM = 0x100;

//GigE设备信息
class MV_GIGE_DEVICE_INFO   {
 	INT nIpCfgOption;					 // IP配置选项 
 	INT nIpCfgCurrent;					 // 当前IP配置 
 	INT nCurrentIp; 					 // 当前IP地址
 	INT nCurrentSubNetMask; 			 // 当前子网掩码 
 	INT nDefultGateWay; 				 // 当前网关
 	BYTE chManufacturerName[32]; 		 // 制造商名称 
 	BYTE chModelName[32]; 				 //型号名称 
 	BYTE chDeviceVersion[32]; 			 // 设备版本 
 	BYTE chManufacturerSpecificInfo[48];// 制造商的具体信息 
 	BYTE chSerialNumber[16]; 			 // 序列号 
 	BYTE chUserDefinedName[16];		 // 用户自定义名称 
 	INT nNetExport; 					 //网口IP地址 
	
 	INT nReserved[4]; 					// 预留
 	_struct_aligned = 1;
}

// USB设备信息 
class MV_USB3_DEVICE_INFO {
 	BYTE CrtlInEndPoint;   						//控制输入端点  
 	BYTE CrtlOutEndPoint; 						    //控制输出端点 
 	BYTE StreamEndPoint; 							//流端点
 	BYTE EventEndPoint; 							//事件端点
 	WORD idVendor; 									//供应商ID号   
 	WORD idProduct; 									//产品ID号 
 	INT nDeviceNumber; 								//设备序列号 
 	BYTE chDeviceGUID [64]; 		//设备GUID号
 	BYTE chVendorName [64]; 		//供应商名字 
 	BYTE chModelName [64]; 		//型号名字
 	BYTE chFamilyName[64]; 		//家族名字
 	BYTE chDeviceVersion[64]; 	//设备版本 
 	BYTE chManufacturerName[64]; //制造商名字 
 	BYTE chSerialNumber[64]; 	//序列号 
 	BYTE chUserDefinedName[64];  //用户自定义名字
 	INT nbcdUSB; 										//支持的USB协议 
 	INT nDeviceAddress; 								//设备地址 
	
 	INT nReserved[2]; 									// 预留
 	 _struct_aligned = 1;
}

// CameraLink设备信息
class MV_CamL_DEV_INFO {
	 BYTE chPortID[64];  //端口号     
 	 BYTE chModelName[64];  //型号名字   
 	 BYTE chFamilyName[64];  //名称       
	 BYTE chDeviceVersion[64];  //设备版本   
	 BYTE chManufacturerName[64];  //制造商名字 
	 BYTE chSerialNumber[64];  //序列号     
 

	 INT nReserved[38]; 
	 _struct_aligned = 1;
}

// 设备信息 
class  MV_CC_DEVICE_INFO {
    
 	WORD nMajorVer; //主要版本 
 	WORD nMinorVer; //次要版本
 	INT nMacAddrHigh; //高MAC地址
 	INT nMacAddrLow; //低MAC地址 
 	INT nTLayerType; //设备传输层协议类型,e.g. MV_GIGE_DEVICE 
 	INT nReserved[4]; // 预留
 	BYTE SpecialInfo[540];
  	
	_struct_aligned = 1; //在结构体中可以使用成员 _struct_aligned 自定义对齐大小。

};

// 通过GenTL枚举到的Interface信息 
class MV_GENTL_IF_INFO {
 BYTE chInterfaceID[64];	// GenTL接口ID
 BYTE chTLType[64];			// 传输层类型 
 BYTE chDisplayName[64];	// Interface显示名称 
 INT nCtiIndex;								// GenTL的cti文件索引 

 INT nReserved[8]; //预留 
 _struct_aligned = 1;
}
 
 class MV_CC_DEVICE_INFO_LIST { 
 	INT DeviceNum; //设备数量
 	pointer pDeviceInfo[255]; //
  };

//输出帧的信息
class MV_FRAME_OUT_INFO_EX {
 WORD nWidth; //图像宽 
 WORD nHeight; //图像高 
 INT enPixelType; //像素格式 

 INT nFrameNum; //帧号 
 INT nDevTimeStampHigh; //时间戳高32位 
 INT nDevTimeStampLow; //时间戳低32位 
 INT nReserved0; //保留,8字节对齐 
 double nHostTimeStamp; //主机生成的时间戳 

 INT nFrameLen; //帧的长度 

 //设备水印时标 
 INT nSecondCount; //秒数 
 INT nCycleCount; //周期数 
 INT nCycleOffset; //周期偏移量 

 float fGain; //增益 
 float fExposureTime; //曝光时间 
 INT nAverageBrightness; //平均亮度 

 //白平衡相关 
 INT nRed; //红色 
 INT nGreen; //绿色 
 INT nBlue; //蓝色 

 INT nFrameCounter; //总帧数 
 INT nTriggerIndex; //触发计数 

 INT nInput; //输入 
 INT nOutput; //输出 

 // ROI区域
 WORD nOffsetX; //水平偏移量 
 WORD nOffsetY; //垂直偏移量 
 WORD nChunkWidth; //Chunk宽 
 WORD nChunkHeight; //Chunk高 

 INT nLostPacket; //本帧丢包数 

 INT nUnparsedChunkNum; //未解析的Chunkdata个数 
 BYTE UnparsedChunkLis[8];

 INT nReserved[36]; // 预留 
  _struct_aligned = 1;

}

//图片保存参数
class MV_SAVE_IMAGE_PARAM_EX {
 pointer pData; //输入数据缓存 
 INT nDataLen; //输入数据大小 
 INT enPixelType; //输入数据的像素格式 
 WORD nWidth; //图像宽 
 WORD nHeight; //图像高 

 pointer pImageBuffer; //输出图片缓存 
 INT nImageLen; //输出图片大小 
 INT nBufferSize; //提供的输出缓冲区大小 
 INT enImageType; //输出图片格式 
 INT nJpgQuality; //JPG编码质量(50-99],其它格式无效

 //Bayer的插值方法 0-快速 1-均衡 2-最优(如果传入其它值则默认为最优)

 INT iMethodValue; //插值方法 
 INT nReserved[3]; //预留 
 _struct_aligned = 1;

}
 var stDeviceInfo = MV_CC_DEVICE_INFO();
 m_stDevList = MV_CC_DEVICE_INFO_LIST();
 
//console.dump("您输入的是" ,s);
var pt ={pointer p;};

 MV_SAVE_IAMGE_TYPE ={
 MV_Image_Undefined = 0, //未定义的图像格式 
 MV_Image_Bmp = 1, //BMP图像格式 
 MV_Image_Jpeg = 2, //JPEG图像格式 
 MV_Image_Png = 3, //PNG图像格式 
 MV_Image_Tif = 4, //TIFF图像格式 
};


class MVCC_INTVALUE {
 INT nCurValue; // 当前值 
 INT nMax; // 最大值 
 INT nMin; // 最小值 
 INT nInc; 

 INT nReserved[4]; ///< \~chinese 预留 
}

function GetOneFrameTimeout ( pData, nDataSize, pFrameInfo, nMsec)
{
    return MV_CC_GetOneFrameTimeout(m_hDevHandle, pData, nDataSize, pFrameInfo, nMsec);
}

winform.emBtn.oncommand = function(id,event){
var  EnumDevices= dll.MV_CC_EnumDevices(1 or 4, m_stDevList );

 //dll.MV_CC_StartGrabbin();
for(i=1;m_stDevList.DeviceNum;1){
	var s  =  raw.convert(m_stDevList.pDeviceInfo[i],stDeviceInfo);
	var TLayerType = s.nTLayerType;
	var DInfo,title;
	win.delay(1);
	if(TLayerType=1){
		DeviceInfo = MV_GIGE_DEVICE_INFO();
		title = "GIGE";
	}
	if(TLayerType=4){
		DeviceInfo = MV_USB3_DEVICE_INFO();
		title = "USB";
	}
	var DeviceInfo =  raw.convert(s.SpecialInfo,MV_GIGE_DEVICE_INFO())
	win.delay(1);
	var ip =DeviceInfo.nCurrentIp;
     //console.dump(DeviceInfo)
	win.delay(1);
	var nIp1, nIp2, nIp3, nIp4 = (ip & 0xff000000) >>24,(ip & 0x00ff0000) >>16,(ip & 0x0000ff00) >>8,ip & 0xff;
	win.delay(1);
	winform.diverListComBox.add(string.format("%s:%s(%d.%d.%d.%d)",title , DeviceInfo.chUserDefinedName,nIp1, nIp2, nIp3, nIp4),-1)

}	
}

winform.OpenBtn.oncommand = function(id,event){

	var nRet = dll.MV_CC_CreateHandle(pt,m_stDevList.pDeviceInfo[winform.diverListComBox.selIndex]);
	if( 0 != nRet )error("连接错误!");
     nRet = dll.MV_CC_OpenDevice(pt.p, 1, 0)
	 win.msgbox(nRet)
}

winform.closeBtn.oncommand = function(id,event){
	if(pt.p){
		 nRet = dll.MV_CC_StopGrabbing(pt.p)
   		 nRet = dll.MV_CC_CloseDevice(pt.p)
   		 nRet = dll.MV_CC_DestroyHandle(pt.p)
    }
}

winform.S_G_Btn.oncommand = function(id,event){
	nRet = dll.MV_CC_StartGrabbing(pt.p)
		
	nRet = dll.MV_CC_Display(pt.p,winform.picturebox.hwnd)
		win.msgbox(nRet)
}
import console;
   var stIntValue =MVCC_INTVALUE();
console.open()

 MV_CC_GetOneFrameTimeout= dll.api("MV_CC_GetOneFrameTimeout","INT ( pointer handle,  string& pData ,INT nDataSize,struct& pstFrameInfo, INT nMsec)");
 //MV_CC_SaveImageEx2= dll.api("MV_CC_SaveImageEx2","int( pointer handle, struct& pstSaveParam)");

winform.button.oncommand = function(id,event){
    //nSaveImageNeedSize = m_nBufSizeForDriver * 3 + 2048
    nRet = dll.MV_CC_GetIntValueEx(pt.p,"PayloadSize", stIntValue);
	stParam = MV_SAVE_IMAGE_PARAM_EX();
	stFrameInfo = MV_FRAME_OUT_INFO_EX()
	//MAX_BUF = 68157440; 
	  
	var pData =stIntValue.nCurValue;
	var ppData = raw.buffer(pData);

	
	var pDatas ={pointer a;};

	nRet,s,s1= MV_CC_GetOneFrameTimeout(pt.p, raw.buffer(pData) , pData, stFrameInfo, 1000);
	


	stParam.enImageType = 2 ; //需要保存的图像类型
            stParam.enPixelType = s1.enPixelType;   //相机对应的像素格式
            stParam.nBufferSize = pData;  //存储节点的大小
            stParam.nWidth = s1.nWidth ;        //相机对应的宽
            stParam.nHeight = s1.nHeight;     //相机对应的高
            stParam.nDataLen = s1.nFrameLen ;
            stParam.pData = s;
            stParam.nJpgQuality = 80;
            stParam.pImageBuffer = ppData;


      //console.dump( stParam) 
 
       nRet = dll.MV_CC_SaveImageEx2(pt.p,stParam)
       string.save("\test.jpg", raw.tostring(ppData))
	  console.dump(nRet)

}



winform.button2.oncommand = function(id,event){

	
	//console.dump(nRet, stIntValue.nCurValue)
	

}

winform.show();
win.loopMessage();

dll调用文件,只写了部分功能,打开摄像头和控制拍照

MvCameraControl.7z


5 个回复 | 最后更新于 2022-06-28
2021-06-13   #1

感谢分享,必须用海康摄像头吗?我有个usb的,明天测一下

2021-06-13   #2

2021-09-24   #3

为啥提示加载不了dll,cannot load library,把dll保存在其他位置也不行

2021-09-24   #4

回复#3 @hsyzxj520 :

有可能你电脑系统少了一些c++运行库,安装运行库大全后试试,或者安装下海康的sdk

2022-07-26   #5

我安装了系统运行库大全,还是一样的错误提示,cannot load library

此帖已被锁定,禁止回复

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...