前言
有個(gè)項(xiàng)目需要使用java程序讀取??低暤南鄼C(jī)圖片。相機(jī)通過以太網(wǎng)連接服務(wù)器,部署在服務(wù)器上的java程序?qū)⑾鄼C(jī)拍攝的畫面保存在指定路徑下。
??低曁峁┝藄dk開發(fā)包,可以在官網(wǎng)中下載,windows和linux系統(tǒng)都有。但是開發(fā)包中給出的示例代碼,無法滿足實(shí)際需要,所以還需要對(duì)代碼進(jìn)行二次開發(fā)。
在進(jìn)行二次開發(fā)時(shí),官網(wǎng)并未提供java語言的開發(fā)手冊(cè),示例代碼中也并未提供詳細(xì)注釋,所以我只能在閱讀示例代碼時(shí),按照自己的理解添加一些注釋。
客戶端創(chuàng)建虛擬相機(jī)
實(shí)體相機(jī)已經(jīng)還回去了,所以這里用MVS客戶端創(chuàng)建一個(gè)虛擬相機(jī),測(cè)試代碼。
設(shè)置相機(jī)名字
示例代碼
我這里只需要對(duì)保存照片的代碼進(jìn)行修改。
以下是官網(wǎng)提供的保存照片的代碼
我在示例代碼中對(duì)一些方法做了注釋
保存圖片程序
/***************************************************************************************************
* @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
{
/**
* 打印連接的設(shè)備信息
* 如果是通過以太網(wǎng)連接的相機(jī),則會(huì)輸出ip、名稱等內(nèi)容
* 如果是通過usb連接的相機(jī),則會(huì)輸出相機(jī)名稱
*/
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());
}
/**
* 保存圖片到本地
* 這個(gè)方法中主要是設(shè)置了文件保存的路徑
*/
public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName)
{
OutputStream os = null;
try
{
// Create directory
File 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 stream
try
{
os.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
* 當(dāng)有多個(gè)相機(jī)連接但程序只能保存一臺(tái)相機(jī)拍攝的照片
* 所以需要通過此方法輸入相機(jī)索引號(hào)
*/
public static int chooseCamera(ArrayList<MV_CC_DEVICE_INFO> stDeviceList)
{
if (null == stDeviceList)
{
return -1;
}
// Choose a device to operate
int camIndex = -1;
Scanner scanner = new Scanner(System.in);
while (true)
{
try
{
/*
* 手動(dòng)輸入
*/
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 camera
camIndex = chooseCamera(stDeviceList);
if (camIndex == -1)
{
break;
}
// Create handle
try
{
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 device
nRet = 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
/*
* 設(shè)置相機(jī)的觸發(fā)器開關(guān) 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 size
MVCC_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 grabbing
nRet = MvCameraControl.MV_CC_StartGrabbing(hCamera);
if (MV_OK != nRet)
{
System.err.printf("Start Grabbing fail, errcode: [%#x]\n", nRet);
break;
}
// Get one frame
MV_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 bytes
byte[] imageBuffer = new byte[imageLen];
// Call MV_CC_SaveImage to save image as JPEG
MV_SAVE_IMAGE_PARAM stSaveParam = new MV_SAVE_IMAGE_PARAM();
stSaveParam.width = stImageInfo.width; // image width
stSaveParam.height = stImageInfo.height; // image height
stSaveParam.data = pData; // image data
stSaveParam.dataLen = stImageInfo.frameLen; // image data length
stSaveParam.pixelType = stImageInfo.pixelType; // image pixel format
stSaveParam.imageBuffer = imageBuffer; // output image buffer
stSaveParam.imageType = MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg; // output image pixel format
stSaveParam.methodValue = 0; // Interpolation method that converts Bayer format to RGB24. 0-Neareast 1-double linear 2-Hamilton
stSaveParam.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 grabbing
nRet = 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 handle
nRet = MvCameraControl.MV_CC_DestroyHandle(hCamera);
if (MV_OK != nRet) {
System.err.printf("DestroyHandle failed, errcode: [%#x]\n", nRet);
}
}
}
}
運(yùn)行結(jié)果
程序啟動(dòng)后,在控制臺(tái)輸出可連接的所有相機(jī),用戶輸入相機(jī)索引號(hào)連接指定相機(jī)。[Camera 0]表示索引號(hào)為0。然后相機(jī)自動(dòng)進(jìn)行拍攝。
修改需求
通過運(yùn)行程序,發(fā)現(xiàn)直接使用示例代碼,無法滿足實(shí)際使用需求。無法做到,圖片保存名稱不重復(fù)、圖片保存路徑無法自定義、需要用戶手動(dòng)輸入相機(jī)索引號(hào)、對(duì)于指定日期以前的舊照片刪除等等。
二次開發(fā)
首先記錄對(duì)核心代碼的修改內(nèi)容,然后再將所有代碼都列出來。
我這里使用了Springboot框架,為的是通過application.yml文件配置路徑等數(shù)量,另外使用maven架構(gòu),方便打包。
SaveImage為核心代碼類
FileUtil用來刪除過期照片
ApplicationYml用來讀取yml文件中的配置
引入外部包
在進(jìn)行二次開發(fā)前,還需要引入官網(wǎng)提供的下載包。
創(chuàng)建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>
對(duì)SaveImage.java文件進(jìn)行修改
這里先對(duì)照著示例代碼,將修改的地方列舉出來。全部代碼后面給出。
示例代碼中一些無關(guān)緊要的輸出內(nèi)容,在二次開發(fā)時(shí)注釋掉了,這里就不再詳細(xì)說明。
修改的地方,通過注釋標(biāo)出
保存圖片saveDataToFile方法
public static void saveDataToFile(byte[] dataToSave, int dataSize, String fileName,String savePath) {
OutputStream os = null;
try {
// Create directory
/*
* savePath參數(shù)為圖片保存路徑,在調(diào)用方法時(shí)通過參數(shù)傳入
*/
File tempFile = new File(savePath);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
os.write(dataToSave, 0, dataSize);
/*
* 圖片保存成功后,輸出當(dāng)前時(shí)間
*/
System.out.println("--- " + sfTime.format(new Date()) + " Save Image succeed ---");
} catch (IOException e) {
e.printStackTrace();
} finally {
// Close file stream
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
選擇相機(jī)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(相機(jī)索引),修改為調(diào)用方法時(shí)傳參
* 實(shí)際值從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("自動(dòng)連接 [camera 0]");
break;
} else {
System.out.println("Input error: " + camIndex);
camIndex=-1;
break;
}
} catch (Exception e) {
e.printStackTrace();
camIndex = -1;
break;
}
}
scanner.close();
/**
* 未修改代碼省略
*/
}
主方法
這里已經(jīng)不是main方法了,因?yàn)槭褂胹pringboot所以有了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
/*
* 設(shè)置拍照觸發(fā)器開關(guān) 出發(fā)模式需要到mvs客戶端中為相機(jī)設(shè)置
* 這里需要把MvCameraControl.MV_CC_SetEnumValueByString()方法第三個(gè)參數(shù)從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
/**
* 在這里設(shè)置照片的保存路徑
*/
String savePathFull = savePath+ sfSave.format(new Date())+"/"+"camera"+camIndex+"/";
saveDataToFile(imageBuffer, stSaveParam.imageLen, "SaveImage-" + sfSecond.format(new Date())+ ".jpeg",savePathFull);
/*
* 有新圖片保存時(shí),刪除X天前保存圖片的文件夾
* X的實(shí)際值,通過參數(shù)傳入
*/
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類處理過期照片
這里使用遞歸,刪除保存的照片文章來源:http://www.zghlxwxcb.cn/news/detail-861590.html
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());
}
}
// 最后刪除當(dāng)前文件夾
dirFile.delete();
}
}
啟動(dòng)類與配置文件
application.yml
config-info:
image: D:/JavaCode/testmaven34hikvision/catch-image/ #圖片保存路徑
deleteDay: 3 #刪除X天前的圖片
connectCamera: 0 #連接相機(jī)編號(hào)
通過實(shí)體類讀取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;
}
}
啟動(dòng)類
@SpringBootApplication
@EnableConfigurationProperties
public class StartImage {
private static ApplicationYml applicationYml;
@Autowired
public 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 stream
try {
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("自動(dòng)連接 [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 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 camera
camIndex = chooseCamera(stDeviceList,camIndex);
if (camIndex == -1) {
break;
}
// Create handle
try {
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 device
nRet = MvCameraControl.MV_CC_OpenDevice(hCamera);
if (MV_OK != nRet) {
System.err.printf("Connect to camera failed, errcode: [%#x]\n", nRet);
break;
}
needConnectDevice = false;
}
/*
測(cè)試線路選擇器
*/
// Make sure that trigger mode is off
nRet = MvCameraControl.MV_CC_SetEnumValueByString(hCamera, "TriggerMode", "On");
if (MV_OK != nRet) {
System.err.printf("SetTriggerMode failed, errcode: [%#x]\n", nRet);
break;
}
// Get payload size
MVCC_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 grabbing
nRet = MvCameraControl.MV_CC_StartGrabbing(hCamera);
if (MV_OK != nRet) {
System.err.printf("Start Grabbing fail, errcode: [%#x]\n", nRet);
break;
}
// Get one frame
MV_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 bytes
byte[] imageBuffer = new byte[imageLen];
// Call MV_CC_SaveImage to save image as JPEG
MV_SAVE_IMAGE_PARAM stSaveParam = new MV_SAVE_IMAGE_PARAM();
stSaveParam.width = stImageInfo.width; // image width
stSaveParam.height = stImageInfo.height; // image height
stSaveParam.data = pData; // image data
stSaveParam.dataLen = stImageInfo.frameLen; // image data length
stSaveParam.pixelType = stImageInfo.pixelType; // image pixel format
stSaveParam.imageBuffer = imageBuffer; // output image buffer
stSaveParam.imageType = MV_SAVE_IAMGE_TYPE.MV_Image_Jpeg; // output image pixel format
stSaveParam.methodValue = 0; // Interpolation method that converts Bayer format to RGB24. 0-Neareast 1-double linear 2-Hamilton
stSaveParam.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 file
String savePathFull = savePath+ sfSave.format(new Date())+"/"+"camera"+camIndex+"/";
saveDataToFile(imageBuffer, stSaveParam.imageLen, "SaveImage-" + sfSecond.format(new Date())+ ".jpeg",savePathFull);
// 有新圖片保存時(shí),刪除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 grabbing
nRet = 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 handle
nRet = MvCameraControl.MV_CC_DestroyHandle(hCamera);
if (MV_OK != nRet) {
System.err.printf("DestroyHandle failed, errcode: [%#x]\n", nRet);
}
}
}
/**
* 根據(jù)年月日計(jì)算圖片的路徑
* @return
*/
private static String imagePathFun(){
SimpleDateFormat sfDate = new SimpleDateFormat("yyyy-M-d");
return "/home/hello/MVS/catch_image/"+sfDate.format(new Date())+"/";
}
}
運(yùn)行結(jié)果
文章來源地址http://www.zghlxwxcb.cn/news/detail-861590.html
到了這里,關(guān)于??低曄鄼C(jī)SDK二次開發(fā)(JAVA語言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!