海康威视相机SDK二次开发(JAVA语言)

目录

      • 前言
      • 客户端创建虚拟相机
      • 示例代码
        • 保存图片程序
        • 运行结果
        • 修改需求
      • 二次开发
        • 引入外部包
        • 对SaveImage.java文件进行修改
          • 保存图片saveDataToFile方法
          • 选择相机chooseCamera方法
          • 主方法
        • FileUtil类处理过期照片
        • 启动类与配置文件
          • application.yml
          • 通过实体类读取yml
          • 启动类
        • SaveImage.java类全部代码
      • 运行结果

前言

有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。
海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,所以还需要对代码进行二次开发。
在进行二次开发时,官网并未提供java语言的开发手册,示例代码中也并未提供详细注释,所以我只能在阅读示例代码时,按照自己的理解添加一些注释。

客户端创建虚拟相机

实体相机已经还回去了,所以这里用MVS客户端创建一个虚拟相机,测试代码。
在这里插入图片描述
在这里插入图片描述

设置相机名字

在这里插入图片描述

示例代码

我这里只需要对保存照片的代码进行修改。
以下是官网提供的保存照片的代码
我在示例代码中对一些方法做了注释

保存图片程序
/**************************************************************************************************** @file      SaveImage.java* @breif     Use functions provided in MvCameraControlWrapper.jar to save image as JPEG。* @author    zhanglei72* @date      2020/02/10** @warning  * @version   V1.0.0  2020/02/10 Create this file* @since     2020/02/10**************************************************************************************************/import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;import MvCameraControlWrapper.*;
import static MvCameraControlWrapper.MvCameraControl.*;
import static MvCameraControlWrapper.MvCameraControlDefines.*;public class SaveImage
{/*** 打印连接的设备信息* 如果是通过以太网连接的相机,则会输出ip、名称等内容* 如果是通过usb连接的相机,则会输出相机名称*/private static void printDeviceInfo(MV_CC_DEVICE_INFO stDeviceInfo) {if (null == stDeviceInfo) {System.out.println("stDeviceInfo is null");return;}if (stDeviceInfo.transportLayerType == MV_GIGE_DEVICE) {System.out.println("\tCurrentIp:       " + stDeviceInfo.gigEInfo.currentIp);System.out.println("\tModel:           " + stDeviceInfo.gigEInfo.modelName);System.out.println("\tUserDefinedName: " + stDeviceInfo.gigEInfo.userDefinedName);} else if (stDeviceInfo.transportLayerType == MV_USB_DEVICE) {System.out.println("\tUserDefinedName: " + stDeviceInfo.usb3VInfo.userDefinedName);System.out.println("\tSerial Number:   " + stDeviceInfo.usb3VInfo.serialNumber);System.out.println("\tDevice Number:   " + stDeviceInfo.usb3VInfo.deviceNumber);} else {System.err.print("Device is not supported! \n");}System.out.println("\tAccessible:      "+ MvCameraControl.MV_CC_IsDeviceAccessible(stDeviceInfo, MV_ACCESS_Exclusive));System.out.println("");}private static void printFrameInfo(MV_FRAME_OUT_INFO stFrameInfo){if (null == stFrameInfo){System.err.println("stFrameInfo is null");return;}StringBuilder frameInfo = new StringBuilder("");frameInfo.append(("\tFrameNum[" + stFrameInfo.frameNum + "]"));frameInfo.append("\tWidth[" + stFrameInfo.width + "]");frameInfo.append("\tHeight[" + stFrameInfo.height + "]");frameInfo.append(String.format("\tPixelType[%#x]", stFrameInfo.pixelType.getnValue()));System.out.println(frameInfo.toString());}/*** 保存图片到本地* 这个方法中主要是设置了文件保存的路径*/public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName){OutputStream os = null;try{// Create directoryFile tempFile = new File("dat");if (!tempFile.exists()) {tempFile.mkdirs();}os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);os.write(dataToSave, 0, dataSize);System.out.println("SaveImage succeed.");}catch (IOException e){e.printStackTrace();}finally{// Close file streamtry {os.close();} catch (IOException e) {e.printStackTrace();}}}/*** 当有多个相机连接但程序只能保存一台相机拍摄的照片* 所以需要通过此方法输入相机索引号*/public static int chooseCamera(ArrayList<MV_CC_DEVICE_INFO> stDeviceList){if (null == stDeviceList){return -1;}// Choose a device to operateint camIndex = -1;Scanner scanner = new Scanner(System.in);while (true){try{/** 手动输入*/System.out.print("Please input camera index (-1 to quit):");camIndex = scanner.nextInt();if ((camIndex >= 0 && camIndex < stDeviceList.size()) || -1 == camIndex){break;}else{System.out.println("Input error: " + camIndex);}}catch (Exception e){e.printStackTrace();camIndex = -1;break;}}scanner.close();if (-1 == camIndex){System.out.println("Bye.");return camIndex;}if (0 <= camIndex && stDeviceList.size() > camIndex){if (MV_GIGE_DEVICE == stDeviceList.get(camIndex).transportLayerType){System.out.println("Connect to camera[" + camIndex + "]: " + stDeviceList.get(camIndex).gigEInfo.userDefinedName);}else if (MV_USB_DEVICE == stDeviceList.get(camIndex).transportLayerType){System.out.println("Connect to camera[" + camIndex + "]: " + stDeviceList.get(camIndex).usb3VInfo.userDefinedName);}else{System.out.println("Device is not supported.");}}else{System.out.println("Invalid index " + camIndex);camIndex = -1;}return camIndex;}/*** 主方法* 保存照片的代码在这里*/public static void main(String[] args){int nRet = MV_OK;int camIndex = -1;Handle hCamera = null;ArrayList<MV_CC_DEVICE_INFO> stDeviceList;do{System.out.println("SDK Version " + MvCameraControl.MV_CC_GetSDKVersion());// Enuerate GigE and USB devices try{stDeviceList = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE);if (0 >= stDeviceList.size()){System.out.println("No devices found!");break;}int i = 0;for (MV_CC_DEVICE_INFO stDeviceInfo : stDeviceList){System.out.println("[camera " + (i++) + "]");printDeviceInfo(stDeviceInfo);}}catch (CameraControlException e){System.err.println("Enumrate devices failed!" + e.toString());e.printStackTrace();break;}// choose cameracamIndex = chooseCamera(stDeviceList);if (camIndex == -1){break;}// Create handletry{hCamera = MvCameraControl.MV_CC_CreateHandle(stDeviceList.get(camIndex));}catch (CameraControlException e){System.err.println("Create handle failed!" + e.toString());e.printStackTrace();hCamera = null;break;}// Open devicenRet = MvCameraControl.MV_CC_OpenDevice(hCamera);if (MV_OK != nRet){System.err.printf("Connect to camera failed, errcode: [%#x]\n", nRet);break;}// Make sure that trigger mode is off/** 设置相机的触发器开关 Off On*/nRet = MvCameraControl.MV_CC_SetEnumValueByString(hCamera, "TriggerMode", "Off");if (MV_OK != nRet){System.err.printf("SetTriggerMode failed, errcode: [%#x]\n", nRet);break;}// Get payload sizeMVCC_INTVALUE stParam = new MVCC_INTVALUE();nRet = MvCameraControl.MV_CC_GetIntValue(hCamera, "PayloadSize", stParam);if (MV_OK != nRet){System.err.printf("Get PayloadSize fail, errcode: [%#x]\n", nRet);break;}// Start grabbingnRet = MvCameraControl.MV_CC_StartGrabbing(hCamera);if (MV_OK != nRet){System.err.printf("Start Grabbing fail, errcode: [%#x]\n", nRet);break;}// Get one frameMV_FRAME_OUT_INFO stImageInfo = new MV_FRAME_OUT_INFO();byte[] pData = new byte[(int)stParam.curValue];nRet = MvCameraControl.MV_CC_GetOneFrameTimeout(hCamera, pData, stImageInfo, 1000);if (MV_OK != nRet){System.err.printf("GetOneFrameTimeout fail, errcode:[%#x]\n", nRet);break;}System.out.println("GetOneFrame: ");printFrameInfo(stImageInfo);int imageLen = stImageInfo.width * stImageInfo.height * 3;    // Every RGB pixel takes 3 bytesbyte[] imageBuffer = new byte[imageLen];// Call MV_CC_SaveImage to save image as JPEGMV_SAVE_IMAGE_PARAM stSaveParam = new MV_SAVE_IMAGE_PARAM();stSaveParam.width = stImageInfo.width;                                  // image widthstSaveParam.height = stImageInfo.height;                                // image heightstSaveParam.data = pData;                                               // image datastSaveParam.dataLen = stImageInfo.frameLen;                             // image data lengthstSaveParam.pixelType = stImageInfo.pixelType;                          // image pixel formatstSaveParam.imageBuffer = imageBuffer;                                  // output image bufferstSaveParam.imageType = MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg;               // output image pixel formatstSaveParam.methodValue = 0;                                            // Interpolation method that converts Bayer format to RGB24.  0-Neareast 1-double linear 2-HamiltonstSaveParam.jpgQuality = 60;                                            // JPG endoding quality(50-99]nRet = MvCameraControl.MV_CC_SaveImage(hCamera, stSaveParam);if (MV_OK != nRet){System.err.printf("SaveImage fail, errcode: [%#x]\n", nRet);break;}// Save buffer content to file/** 将照片保存在本地,且在这里指定文件的名称*/saveDataToFile(imageBuffer, stSaveParam.imageLen, "SaveImage.jpeg");// Stop grabbingnRet = MvCameraControl.MV_CC_StopGrabbing(hCamera);if (MV_OK != nRet){System.err.printf("StopGrabbing fail, errcode: [%#x]\n", nRet);break;}} while (false);if (null != hCamera){// Destroy handlenRet = MvCameraControl.MV_CC_DestroyHandle(hCamera);if (MV_OK != nRet) {System.err.printf("DestroyHandle failed, errcode: [%#x]\n", nRet);}}}
}
运行结果

在这里插入图片描述
程序启动后,在控制台输出可连接的所有相机,用户输入相机索引号连接指定相机。[Camera 0]表示索引号为0。然后相机自动进行拍摄。
在这里插入图片描述

修改需求

通过运行程序,发现直接使用示例代码,无法满足实际使用需求。无法做到,图片保存名称不重复、图片保存路径无法自定义、需要用户手动输入相机索引号、对于指定日期以前的旧照片删除等等。

二次开发

首先记录对核心代码的修改内容,然后再将所有代码都列出来。
我这里使用了Springboot框架,为的是通过application.yml文件配置路径等数量,另外使用maven架构,方便打包。
在这里插入图片描述

SaveImage为核心代码类
FileUtil用来删除过期照片
ApplicationYml用来读取yml文件中的配置

引入外部包

在进行二次开发前,还需要引入官网提供的下载包。
在这里插入图片描述
创建lib文件夹,将jar放入后,右击,Add as library。
在pom.xml文件中引入依赖

    <dependencies><dependency><groupId>com.hzx.testmaven34hikvision</groupId><artifactId>MvCameraControlWrapper</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/MvCameraControlWrapper.jar</systemPath></dependency></dependencies>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.0.RELEASE</version><configuration><fork>true</fork><includeSystemScope>true</includeSystemScope></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins>
</build>
对SaveImage.java文件进行修改

这里先对照着示例代码,将修改的地方列举出来。全部代码后面给出。
示例代码中一些无关紧要的输出内容,在二次开发时注释掉了,这里就不再详细说明。
修改的地方,通过注释标出

保存图片saveDataToFile方法
    public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName,String savePath) {OutputStream os = null;try {// Create directory/** savePath参数为图片保存路径,在调用方法时通过参数传入*/File tempFile = new File(savePath);if (!tempFile.exists()) {tempFile.mkdirs();}os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);os.write(dataToSave, 0, dataSize);/** 图片保存成功后,输出当前时间*/System.out.println("--- " + sfTime.format(new Date()) + " Save Image succeed ---");} catch (IOException e) {e.printStackTrace();} finally {// Close file streamtry {os.close();} catch (IOException e) {e.printStackTrace();}}}
选择相机chooseCamera方法
    public static int chooseCamera(ArrayList<MV_CC_DEVICE_INFO> stDeviceList,int camIndex) {if (null == stDeviceList) {return -1;}// Choose a device to operate//int camIndex = -1;Scanner scanner = new Scanner(System.in);while (true) {try {/** 原本需要用户输入的camIndex(相机索引),修改为调用方法时传参* 实际值从yml文件中获取*///System.out.print("Please input camera index (-1 to quit):");//camIndex = scanner.nextInt();//camIndex = 1;if ((camIndex >= 0 && camIndex < stDeviceList.size()) || -1 == camIndex) {// System.out.println("自动连接 [camera 0]");break;} else {System.out.println("Input error: " + camIndex);camIndex=-1;break;}} catch (Exception e) {e.printStackTrace();camIndex = -1;break;}}scanner.close();/*** 未修改代码省略*/}
主方法

这里已经不是main方法了,因为使用springboot所以有了StartApplication类

    public static void mainImage(String savePath,Integer deleteDay,int camIndex) {int nRet = MV_OK;// int camIndex = -1;Handle hCamera = null;ArrayList<MV_CC_DEVICE_INFO> stDeviceList;boolean needConnectDevice = true;do {// Make sure that trigger mode is off/** 设置拍照触发器开关 出发模式需要到mvs客户端中为相机设置* 这里需要把MvCameraControl.MV_CC_SetEnumValueByString()方法第三个参数从Off改为On*/nRet = MvCameraControl.MV_CC_SetEnumValueByString(hCamera, "TriggerMode", "On");if (MV_OK != nRet) {System.err.printf("SetTriggerMode failed, errcode: [%#x]\n", nRet);break;}nRet = MvCameraControl.MV_CC_SaveImage(hCamera, stSaveParam);if (MV_OK != nRet) {//System.err.printf("SaveImage fail, errcode: [%#x]\n", nRet);// System.out.println(sfTime.format(new Date())+" "+ nRet + " No Image Need Save...");// break;//continue;} else {// 保存照片的方法 Save buffer content to file/*** 在这里设置照片的保存路径*/String savePathFull = savePath+ sfSave.format(new Date())+"/"+"camera"+camIndex+"/";saveDataToFile(imageBuffer, stSaveParam.imageLen, "SaveImage-" + sfSecond.format(new Date())+ ".jpeg",savePathFull);/* * 有新图片保存时,删除X天前保存图片的文件夹* X的实际值,通过参数传入*/Calendar calendar = Calendar.getInstance();calendar.setTime(new Date());// X天前的日期calendar.add(Calendar.DATE,(-deleteDay));String deleteFile = savePath+sfSave.format(calendar.getTime())+"/";FileUtil.deleteAllFile(deleteFile);}} while (true);}
FileUtil类处理过期照片

这里使用递归,删除保存的照片

public class FileUtil {public static void deleteAllFile(String dir){File dirFile = new File(dir);// 判断dir是否是目录且dir是否存在if (!dirFile.exists()||(!dirFile.isDirectory())) {// System.out.println("目录:"+dir+" 不存在");return;}// 删除文件夹中所有的文件,包括子文件夹File[] files = dirFile.listFiles();for (int i = 0; i < files.length; i++) {if (files[i].isFile()) {// 如果是文件直接删除files[i].delete();}else if(files[i].isDirectory()){// 如果是目录,则通过递归删除deleteAllFile(files[i].getAbsolutePath());}}// 最后删除当前文件夹dirFile.delete();}
}
启动类与配置文件
application.yml
config-info:image: D:/JavaCode/testmaven34hikvision/catch-image/ #图片保存路径deleteDay: 3 #删除X天前的图片connectCamera: 0 #连接相机编号
通过实体类读取yml
@ConfigurationProperties(prefix = "config-info")
@Component
public class ApplicationYml {private String image;private String deleteDay;private String connectCamera;public ApplicationYml() {}public String getImage() {return image;}public void setImage(String image) {this.image = image;}public String getDeleteDay() {return deleteDay;}public void setDeleteDay(String deleteDay) {this.deleteDay = deleteDay;}public String getConnectCamera() {return connectCamera;}public void setConnectCamera(String connectCamera) {this.connectCamera = connectCamera;}
}
启动类
@SpringBootApplication
@EnableConfigurationProperties
public class StartImage {private static ApplicationYml applicationYml;@Autowiredpublic void setApplicationYml(ApplicationYml applicationYml) {this.applicationYml = applicationYml;}public static void main(String[] args) throws Exception {SpringApplication.run(StartImage.class, args);System.out.println("image: "+applicationYml.getImage());System.out.println("deleteDay: "+applicationYml.getDeleteDay());System.out.println("camera: "+applicationYml.getConnectCamera());String image = applicationYml.getImage();SaveImage.mainImage(image,Integer.valueOf(applicationYml.getDeleteDay()),Integer.valueOf(applicationYml.getConnectCamera()));}
}
SaveImage.java类全部代码
public class SaveImage {private static SimpleDateFormat sfSecond = new SimpleDateFormat("yyyy-M-d_HH-mm-dd-SSS");private static SimpleDateFormat sfTime = new SimpleDateFormat("HH:mm:ss");private static SimpleDateFormat sfSave = new SimpleDateFormat("yyyy-M-d");private static void printDeviceInfo(MV_CC_DEVICE_INFO stDeviceInfo) {if (null == stDeviceInfo) {System.out.println("stDeviceInfo is null");return;}if (stDeviceInfo.transportLayerType == MV_GIGE_DEVICE) {System.out.println("\tCurrentIp:       " + stDeviceInfo.gigEInfo.currentIp);System.out.println("\tModel:           " + stDeviceInfo.gigEInfo.modelName);System.out.println("\tUserDefinedName: " + stDeviceInfo.gigEInfo.userDefinedName);} else if (stDeviceInfo.transportLayerType == MV_USB_DEVICE) {System.out.println("\tUserDefinedName: " + stDeviceInfo.usb3VInfo.userDefinedName);System.out.println("\tSerial Number:   " + stDeviceInfo.usb3VInfo.serialNumber);System.out.println("\tDevice Number:   " + stDeviceInfo.usb3VInfo.deviceNumber);} else {System.err.print("Device is not supported! \n");}System.out.println("\tAccessible:      " + MvCameraControl.MV_CC_IsDeviceAccessible(stDeviceInfo, MV_ACCESS_Exclusive));System.out.println("");}private static void printFrameInfo(MV_FRAME_OUT_INFO stFrameInfo) {if (null == stFrameInfo) {System.err.println("stFrameInfo is null");return;}StringBuilder frameInfo = new StringBuilder("");frameInfo.append(("\tFrameNum[" + stFrameInfo.frameNum + "]"));frameInfo.append("\tWidth[" + stFrameInfo.width + "]");frameInfo.append("\tHeight[" + stFrameInfo.height + "]");frameInfo.append(String.format("\tPixelType[%#x]", stFrameInfo.pixelType.getnValue()));// System.out.println(frameInfo.toString());}public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName,String savePath) {OutputStream os = null;try {// Create directory//File tempFile = new File(imagePathFun());File tempFile = new File(savePath);if (!tempFile.exists()) {tempFile.mkdirs();}os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);os.write(dataToSave, 0, dataSize);System.out.println("--- " + sfTime.format(new Date()) + " Save Image succeed ---");} catch (IOException e) {e.printStackTrace();} finally {// Close file streamtry {os.close();} catch (IOException e) {e.printStackTrace();}}}public static int chooseCamera(ArrayList<MV_CC_DEVICE_INFO> stDeviceList,int camIndex) {if (null == stDeviceList) {return -1;}// Choose a device to operate//int camIndex = -1;Scanner scanner = new Scanner(System.in);while (true) {try {//System.out.print("Please input camera index (-1 to quit):");//camIndex = scanner.nextInt();//camIndex = 1;if ((camIndex >= 0 && camIndex < stDeviceList.size()) || -1 == camIndex) {// System.out.println("自动连接 [camera 0]");break;} else {System.out.println("Input error: " + camIndex);camIndex=-1;break;}} catch (Exception e) {e.printStackTrace();camIndex = -1;break;}}scanner.close();if (-1 == camIndex) {System.out.println("Bye.");return camIndex;}if (0 <= camIndex && stDeviceList.size() > camIndex) {if (MV_GIGE_DEVICE == stDeviceList.get(camIndex).transportLayerType) {System.out.println("Connect to camera[" + camIndex + "]: " + stDeviceList.get(camIndex).gigEInfo.userDefinedName);} else if (MV_USB_DEVICE == stDeviceList.get(camIndex).transportLayerType) {System.out.println("Connect to camera[" + camIndex + "]: " + stDeviceList.get(camIndex).usb3VInfo.userDefinedName);} else {System.out.println("Device is not supported.");}} else {System.out.println("Invalid index " + camIndex);camIndex = -1;}return camIndex;}public static void mainImage(String savePath,Integer deleteDay,int camIndex) {int nRet = MV_OK;// int camIndex = -1;Handle hCamera = null;ArrayList<MV_CC_DEVICE_INFO> stDeviceList;boolean needConnectDevice = true;do {if (needConnectDevice) {System.out.println("SDK Version " + MvCameraControl.MV_CC_GetSDKVersion());// Enuerate GigE and USB devicestry {stDeviceList = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE);if (0 >= stDeviceList.size()) {System.out.println("No devices found!");break;}int i = 0;for (MV_CC_DEVICE_INFO stDeviceInfo : stDeviceList) {System.out.println("[camera " + (i++) + "]");printDeviceInfo(stDeviceInfo);}} catch (CameraControlException e) {System.err.println("Enumrate devices failed!" + e.toString());e.printStackTrace();break;}// choose cameracamIndex = chooseCamera(stDeviceList,camIndex);if (camIndex == -1) {break;}// Create handletry {hCamera = MvCameraControl.MV_CC_CreateHandle(stDeviceList.get(camIndex));} catch (CameraControlException e) {System.err.println("Create handle failed!" + e.toString());e.printStackTrace();hCamera = null;break;}// Open devicenRet = MvCameraControl.MV_CC_OpenDevice(hCamera);if (MV_OK != nRet) {System.err.printf("Connect to camera failed, errcode: [%#x]\n", nRet);break;}needConnectDevice = false;}/*测试线路选择器*/// Make sure that trigger mode is offnRet = MvCameraControl.MV_CC_SetEnumValueByString(hCamera, "TriggerMode", "On");if (MV_OK != nRet) {System.err.printf("SetTriggerMode failed, errcode: [%#x]\n", nRet);break;}// Get payload sizeMVCC_INTVALUE stParam = new MVCC_INTVALUE();nRet = MvCameraControl.MV_CC_GetIntValue(hCamera, "PayloadSize", stParam);if (MV_OK != nRet) {System.err.printf("Get PayloadSize fail, errcode: [%#x]\n", nRet);break;}// Start grabbingnRet = MvCameraControl.MV_CC_StartGrabbing(hCamera);if (MV_OK != nRet) {System.err.printf("Start Grabbing fail, errcode: [%#x]\n", nRet);break;}// Get one frameMV_FRAME_OUT_INFO stImageInfo = new MV_FRAME_OUT_INFO();byte[] pData = new byte[(int) stParam.curValue];nRet = MvCameraControl.MV_CC_GetOneFrameTimeout(hCamera, pData, stImageInfo, 1000);if (MV_OK != nRet) {System.err.printf("GetOneFrameTimeout fail, errcode:[%#x]\n", nRet);break;}// System.out.println("GetOneFrame: ");printFrameInfo(stImageInfo);int imageLen = stImageInfo.width * stImageInfo.height * 3;    // Every RGB pixel takes 3 bytesbyte[] imageBuffer = new byte[imageLen];// Call MV_CC_SaveImage to save image as JPEGMV_SAVE_IMAGE_PARAM stSaveParam = new MV_SAVE_IMAGE_PARAM();stSaveParam.width = stImageInfo.width;                                  // image widthstSaveParam.height = stImageInfo.height;                                // image heightstSaveParam.data = pData;                                               // image datastSaveParam.dataLen = stImageInfo.frameLen;                             // image data lengthstSaveParam.pixelType = stImageInfo.pixelType;                          // image pixel formatstSaveParam.imageBuffer = imageBuffer;                                  // output image bufferstSaveParam.imageType = MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg;               // output image pixel formatstSaveParam.methodValue = 0;                                            // Interpolation method that converts Bayer format to RGB24.  0-Neareast 1-double linear 2-HamiltonstSaveParam.jpgQuality = 60;                                            // JPG endoding quality(50-99]nRet = MvCameraControl.MV_CC_SaveImage(hCamera, stSaveParam);if (MV_OK != nRet) {//System.err.printf("SaveImage fail, errcode: [%#x]\n", nRet);// System.out.println(sfTime.format(new Date())+" "+ nRet + " No Image Need Save...");// break;//continue;} else {// 保存照片的方法 Save buffer content to fileString savePathFull = savePath+ sfSave.format(new Date())+"/"+"camera"+camIndex+"/";saveDataToFile(imageBuffer, stSaveParam.imageLen, "SaveImage-" + sfSecond.format(new Date())+ ".jpeg",savePathFull);// 有新图片保存时,删除X天前保存图片的文件夹Calendar calendar = Calendar.getInstance();calendar.setTime(new Date());// X天前的日期calendar.add(Calendar.DATE,(-deleteDay));String deleteFile = savePath+sfSave.format(calendar.getTime())+"/";FileUtil.deleteAllFile(deleteFile);}// Stop grabbingnRet = MvCameraControl.MV_CC_StopGrabbing(hCamera);if (MV_OK != nRet) {System.err.printf("StopGrabbing fail, errcode: [%#x]\n", nRet);break;}//            try {//                Thread.sleep(1000);//            } catch (InterruptedException e) {//                e.printStackTrace();//            }} while (true);if (null != hCamera) {// Destroy handlenRet = MvCameraControl.MV_CC_DestroyHandle(hCamera);if (MV_OK != nRet) {System.err.printf("DestroyHandle failed, errcode: [%#x]\n", nRet);}}}/*** 根据年月日计算图片的路径* @return*/private static String imagePathFun(){SimpleDateFormat sfDate = new SimpleDateFormat("yyyy-M-d");return "/home/hello/MVS/catch_image/"+sfDate.format(new Date())+"/";}
}

运行结果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/278596.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JS逆向学习】猿人学第六题 js混淆 回溯

逆向目标 网址&#xff1a;https://match.yuanrenxue.cn/match/6接口&#xff1a;https://match.yuanrenxue.cn/api/match/6参数&#xff1a;payload(m、q) 逆向过程 老规矩&#xff0c;先来分析网络请求&#xff0c;加密的地方一目了然&#xff0c;没什么可多说的&#xff…

惬意上手Redis

Redis介绍 Redis&#xff08;全称为REmote Dictionary Server&#xff09;是一个开源的、内存中的数据存储结构&#xff0c;主要用作应用程序缓存或快速相应数据库。 REmote Dictionary Server: 有道翻译Redis是“远程字典服务”&#xff0c;远程不过是远程访问&#xff0c;而…

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网&#xff0c;并且搭建了ntp服务给其他主机同步 另外一个没有连接外网&#xff0c;通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器&#xff0c;主…

07|链(下):想学“育花”还是“插花”用RouterChain确定客户意图

任务设定 鲜花养护&#xff08;保持花的健康、如何浇水、施肥等&#xff09;鲜花装饰&#xff08;如何搭配花、如何装饰场地等&#xff09; 如果接到的是第一类问题&#xff0c;你要给ChatBot A指示&#xff1b;如果接到第二类的问题&#xff0c;你要给ChatBot B指示。 整体…

数据可信流通,从运维信任到技术信任

信任 共同观点&#xff1a; 信任是涉及交易或交换关系的基础 身份可确认利益可依赖能力有预期行为有后果 数据流通中的不可信风险 内循环&#xff1a;数据持有方在自己的运维安全域内对自己的额数据使用和安全拥有全责外循环&#xff1a;数据要素在离开持有方安全域后&#…

【网络安全】 MSF生成木马教程

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统位数IP攻击机Kali Linux6410.3.0.231客户端Windows 76410.3.0.234…

ACWing--基础算法--贪心(部分题解)

目录 906.区间问题--区间分组 906.区间问题--区间分组 原题&#xff1a; 给定 N 个闭区间 [ai,bi]&#xff0c;请你将这些区间分成若干组&#xff0c;使得每组内部的区间两两之间&#xff08;包括端点&#xff09;没有交集&#xff0c;并使得组数尽可能小。 输出最小组数。 输…

Linux 部署 Samba 服务

一、Ubuntu 部署 Samba 1、安装 Samba # 更新本地软件包列表 sudo apt update# 安装Samba sudo apt install samba# 查看版本 smbd --version2、创建共享文件夹&#xff0c;并配置 Samba 创建需要共享的文件夹&#xff0c;并赋予权限&#xff1a; sudo mkdir /home/test sud…

分布式事务的解决方案--Seata架构

一、Seata的XA模式 二、AT模式原理 三、TCC模式原理 四、MQ分布式事务 异步&#xff0c;非实时&#xff0c;实现最终的一致性。 四、分布式事务的解决方案

VMware下创建虚拟机

Centos7是比较常用的一个Linux发行版本&#xff0c;在国内的使用比例比较高 安装完VMware一定要检查虚拟网卡有没有安装成功&#xff0c;如果没有VMnet1和VMnet8 虚拟机是无法上网的&#xff0c;就需要卸载重启电脑重新安装 控制面板—网络和Internet—网络连接 快捷方式打开&a…

用`ORDER BY RAND()`随机化你的查询结果

[TOC](用ORDER BY RAND()随机化你的查询结果) 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 《java 专栏》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&…

1.中医学习-总论

目录 1.为什么要学中医 2.什么是中医 介绍 中医例子1&#xff1a; 中医例子2: 中医最高境界“大道至简” 中医讲究的是本质 中医核心&#xff1a;阴阳、表里、寒热、虚实 ​编辑医不叩门 3.阴阳 1.一天中的阴阳 2.一年中的阴阳 3.阴阳之间的关系 4.阴阳四季的变化 …

代码随想录算法训练营第二十五天|216.组合总和III,17.电话号码的字母组合

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …

Qt学习--继承(并以分文件实现)

基类 & 派生类 一个类可以派生自多个类&#xff0c;这意味着&#xff0c;它可以从多个基类继承数据和函数。定义一个派生类&#xff0c;我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名。 总结&#xff1a;简单来说&#xff0c;父类有的&#xff0c;子…

对OceanBase进行 sysbench 压测前,如何用 obdiag巡检

有一些用户想对 OceanBase 进行 sysbench 压测&#xff0c;并向我询问是否需要对数据库的各种参数进行调整。我想起有一个工具 obdiag &#xff0c;具备对集群进行巡检的功能。因此&#xff0c;我正好借此机会试用一下这个工具。 obdiag 功能的比较丰富&#xff0c;详细情况可参…

【linux】进程间通信1--管道

文章目录 进程间通信是什么&#xff1f;如何做&#xff1f; 管道匿名管道命名管道 进程间通信 是什么&#xff1f; 进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是指在操作系统中&#xff0c;不同的进程之间进行数据交换、信息传递和同步操…

函数-Python

师从黑马程序员 函数初体验 str1"asdf" str2"qewrew" str3"rtyuio" def my_len(data):count0for i in data:count1print(f"字符串{data}的长度是{count}")my_len(str1) my_len(str2) my_len(str3) 函数的定义 函数的调用 函数名&a…

使用Navicat远程连接Linux中的MySQL

一、登录MySQL数据库 mysql -uroot -pXjm123456 二、使用mysql数据库 use mysql&#xff1b; 三、查询user表中包含host的字段 select user,host from user;### 该字段中&#xff0c;localhost表示只允许本机访问&#xff0c;可以将‘localhost’改为‘%’&#xff0c;‘%’表…

机器学习-04-分类算法-01决策树

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 参考 决策树——ID3和C4.5&#xff08;理论图解公式推导&#xff09; 策略产品经理必读系列—第七讲ID3、C4.5和CART算法详解 决策树&#xff08;…