海康摄像头拍照(java版,拿走即用)

这是我测试用的main方法

把代码复制走, 只需要修改一下录像机的ip账号密码就可以了

我测试的时候是吧录像机下的所有摄像头都进行了拍照, 你可以根据你的需求进行修改

海康的SDK自行去官网下载

(如需要卡口手动抓拍代码,请留言!)

(如果拍照失败出现29: 客服解答是抓拍太频繁,换一种抓拍方式,但是另外一种太麻烦了、

我就直接调取摄像机拍照就行了, 不通过录像机抓取)

package com.qymj.utils.paizhao;

import java.io.File;

import com.qymj.utils.paizhao.HCNetSDK.NET_DVR_DEVICEINFO;
import com.qymj.utils.paizhao.HCNetSDK.NET_DVR_IPPARACFG;
import com.qymj.utils.paizhao.HCNetSDK.NET_DVR_JPEGPARA;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;

public class paizhao {
	/**
	 * @param args
	 * 
	 */
	private static String sDVRIP="127.0.0.1";
	private static short sDVRPort=8000;
	private static String sUserName="admin";
	private static String sPassword="admin123";
	private static String fileRoot="d:/paizhao";
	private static int start=0;
	private static int end=0;
	private static short wPicSize=0xff;///* 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA*/
	private static short wPicQuality=0;// 图片质量系数 0-最好 1-较好 2-一般
	public static void main(String[] args) {
		File f=new File(fileRoot);
		if(!f.exists()){
			f.mkdirs();
		}
		NET_DVR_DEVICEINFO lpDeviceInfo=new NET_DVR_DEVICEINFO();
		//加载属性文件
		//loadProperties();
		//创建海康SDK实例
		HCNetSDK hk = HCNetSDK.INSTANCE	;
		//SDK初始化
		boolean init=hk.NET_DVR_Init();
		if(init){//true表示SDK初始化成功
			
		}
		//DVR登录
		NativeLong userId=hk.NET_DVR_Login(sDVRIP, sDVRPort, sUserName, sPassword, lpDeviceInfo);
		NET_DVR_IPPARACFG ipparacfg=new NET_DVR_IPPARACFG();
		
		ipparacfg.write();
		Pointer lpIpParaConfig = ipparacfg.getPointer();
		IntByReference lpBytesReturned = new IntByReference(0);//获取IP接入配置参数
		boolean configIsOk=hk.NET_DVR_GetDVRConfig(userId, hk.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, ipparacfg.size(), lpBytesReturned);
		ipparacfg.read();
		
		 if (!configIsOk){//设备不支持,则表示没有IP通道
			 for (int iChannum = 0; iChannum < lpDeviceInfo.byChanNum; iChannum++) {
				 System.out.println(("Camera" + (iChannum +" not support "+ lpDeviceInfo.byStartChan)));
			 }
	     }else{//设备支持IP通道
	     	for (int iChannum = 0; iChannum < lpDeviceInfo.byChanNum; iChannum++){
	        	if(ipparacfg.byAnalogChanEnable[iChannum] == 1){
	        		 System.out.println(("Camera" + (iChannum +" 支持  "+ lpDeviceInfo.byStartChan)));
	            }
	     	}
	     	for(int iChannum =0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum++){
	             if (ipparacfg.struIPChanInfo[iChannum].byEnable == 1)
	             {
	            	 System.out.println("IPCamera" + (iChannum + lpDeviceInfo.byStartChan)+" ip:"+new String(ipparacfg.struIPDevInfo[iChannum].struIP.sIpV4).trim()+
	            			 " byChannel="+ipparacfg.struIPChanInfo[iChannum].byChannel+" byEnable="+ipparacfg.struIPChanInfo[iChannum].byEnable+
	            			 " byIPID="+ipparacfg.struIPChanInfo[iChannum].byIPID);
	             }
	     	}
	     }
		System.out.println("登录的userId="+userId);
		if(end>0 && start<end){
			for(int iChannum =start; iChannum <=end; iChannum++){
				NativeLong tdh=new NativeLong(iChannum);
				NET_DVR_JPEGPARA cs=new NET_DVR_JPEGPARA();
					cs.wPicSize=wPicSize;
					cs.wPicQuality=wPicQuality;
					String fileName=fileRoot+"/"+sDVRIP+"_"+tdh+".jpeg";
					boolean pz=hk.NET_DVR_CaptureJPEGPicture(userId, tdh, cs, fileName);
					System.out.println("拍照通道号"+tdh+":"+(pz?"拍照成功照片在"+fileName:"拍照失败!!失败代码:"+hk.NET_DVR_GetLastError()));
			
			}
		}else{
			for(int iChannum =0; iChannum < HCNetSDK.MAX_IP_CHANNEL; iChannum++){
				NativeLong tdh=new NativeLong(ipparacfg.struIPChanInfo[iChannum].byIPID+32);
				String ip=new String(ipparacfg.struIPDevInfo[iChannum].struIP.sIpV4).trim();
				if (ipparacfg.struIPChanInfo[iChannum].byEnable == 1){
					NET_DVR_JPEGPARA cs=new NET_DVR_JPEGPARA();
					cs.wPicSize=wPicSize;
					cs.wPicQuality=wPicQuality;
					String fileName=fileRoot+"/"+ip+"_"+tdh+".jpeg";
					boolean pz=hk.NET_DVR_CaptureJPEGPicture(userId, tdh, cs, fileName);
					System.out.println("拍照通道号"+tdh+":"+(pz?"拍照成功照片在"+fileName:"拍照失败!!失败代码:"+hk.NET_DVR_GetLastError()));
				}else{
					System.out.println("通道号"+tdh+"没有启用!IP="+ip);
				}
			}
		}
		hk.NET_DVR_Logout(userId);
		hk.NET_DVR_Cleanup();
	}
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java代码实现海康摄像头拍照,首先需要确保已经正确安装了海康摄像头的驱动和软件,并将相关的jar包导入到项目中。 以下是一个简单的实现代码示例: ```java import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.win32.StdCallLibrary; public class HikvisionCamera { public static interface HCNetSDK extends StdCallLibrary { HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK", HCNetSDK.class); boolean NET_DVR_Init(); boolean NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo); boolean NET_DVR_Logout(NativeLong lUserID); NativeLong NET_DVR_RealPlay_V30(NativeLong lUserID, NET_DVR_CLIENTINFO lpClientInfo, FRealDataCallBack_V30 fRealDataCallBack_V30, Pointer pUser, boolean bBlocked); boolean NET_DVR_CaptureJPEGPicture(NativeLong lRealHandle, String sPicFileName); } public static class NET_DVR_DEVICEINFO_V30 extends Structure { public byte[] sSerialNumber = new byte[HCNetSDK.NET_DVR_SERIALNO_LEN]; // 其他信息 } public static class NET_DVR_CLIENTINFO extends Structure { public NativeLong iUserID; public int iChannel; public int iLinkMode; // 其他信息 } public static class HCNetSDK.NET_DVR_PREVIEWINFO extends Structure { // 其他信息 } public static interface FRealDataCallBack_V30 extends StdCallCallback { public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser); } public static void main(String[] args) { HCNetSDK sdk = HCNetSDK.INSTANCE; // 初始化海康SDK boolean initSuc = sdk.NET_DVR_Init(); if (!initSuc) { System.out.println("初始化海康SDK失败"); return; } // 登录设备获取用户ID NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30(); NativeLong lUserID = sdk.NET_DVR_Login_V30("设备IP地址", (short) 8000, "用户名", "密码", deviceInfo); if (lUserID.intValue() == -1) { System.out.println("登录设备失败"); return; } // 预览实时视频(可选) NET_DVR_CLIENTINFO clientInfo = new NET_DVR_CLIENTINFO(); clientInfo.iUserID = lUserID; clientInfo.iChannel = 1; // 通道号 clientInfo.iLinkMode = 0; NativeLong lRealHandle = sdk.NET_DVR_RealPlay_V30(lUserID, clientInfo, null, null, true); // 拍照 boolean captureSuc = sdk.NET_DVR_CaptureJPEGPicture(lRealHandle, "保存路径/图片名称.jpg"); if (captureSuc) { System.out.println("拍照成功"); } else { System.out.println("拍照失败"); } // 登出设备 sdk.NET_DVR_Logout(lUserID); } } ``` 这段代码中,我们通过调用海康SDK提供的相关方法,首先进行SDK的初始化,然后使用设备的IP地址、用户名和密码进行登录,获取到用户ID。 通过设置相应的参数,我们可以选择是否进行实时视频预览。最后,通过调用`NET_DVR_CaptureJPEGPicture`方法,传入实时视频句柄和图片保存路径,即可实现拍照功能。 请记得将代码中的"设备IP地址"、"用户名"、"密码"和"保存路径/图片名称"替换为实际的摄像头设备信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值