增加ftp来给视觉服务修改照片

湖北-大华摄像头
LAPTOP-S9HJSOEB\昊天 2 years ago
parent b16f24dd96
commit cf91bb8b65

@ -1,11 +1,9 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.lib.CameraDelayTask;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import com.zhehekeji.web.service.ksec.KsecInfo;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.putian.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
@ -87,44 +85,12 @@ public class Decoder extends DelimiterBasedFrameDecoder {
if(HEART_BEAT.equals(transmissionPojo.getHeader())){
ClientChanel.connect(transmissionPojo.getStreetNumber(),ctx.channel());
}
//获取照片后发送进行计算逻辑,并在拍照队列中取出拍照发送
else if(GET_PHOTO_END.equals(transmissionPojo.getHeader())){
if(transmissionPojo.getTaskId() != null && !"0".equals(transmissionPojo.getTaskId())) {
ClientChanel.get(transmissionPojo.getStreetNumber()).writeAndFlush(transmissionPojo.toString(TransmissionType.RTS));
}
try {
Thread.sleep(50L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//删除队列的拍照数据
GetPhotoDelayExecutor.remove(transmissionPojo.getStreetNumber(),transmissionPojo.toString(TransmissionType.GPS));
//发送给上位机
CameraDelayTask cameraDelayTask = GetPhotoDelayExecutor.getNext(transmissionPojo.getStreetNumber());
if (cameraDelayTask != null) {
TransmissionPojo pojo = new TransmissionPojo(cameraDelayTask.getCommand());
ClientChanel.get(pojo.getStreetNumber()).writeAndFlush(pojo.toString(TransmissionType.GPS));
}
}
//照片和结果保存,并发送给上位机
//将新图片旧图片从队列删除,并保存相关信息
else if(RETURN_CHECK.equals(transmissionPojo.getHeader())){
//保存数据
plcService.visualCalculationResults(transmissionPojo);
//发送给上位机
KsecInfo ksecInfo = plcService.getKsecDataInfo(transmissionPojo,"E");
ksecInfo.getData().setTypeNum(transmissionPojo.getCategory());
ksecInfo.getData().setQuantity(transmissionPojo.getCount());
ksecInfo.getData().setCheckRlt(transmissionPojo.getResult());
KsecNettyClient.write(ksecInfo);
}
//照片和结果保存,并发送给上位机
else if(FOLLOW_GET_PHOTO_END.equals(transmissionPojo.getHeader())){
//保存数据
plcService.saveFollowPhoto(transmissionPojo);
}
}
}

@ -1,6 +1,5 @@
package com.zhehekeji.web.service.client;
import com.zhehekeji.web.service.EmptyCheckService;
import com.zhehekeji.web.service.PlcService;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;

@ -11,38 +11,12 @@ import java.util.Set;
@Data
public class TransmissionPojo {
private String data;
private String[] dataArray;
private String header;
private String streetNumber;//巷道标识符
private Integer row;//行
private Integer column;//列
private String pcd;//点位文件路径
private String taskId;
private String checkId;
private Integer direction;//左右
private Integer count = 0; //数量
private String category = ""; //品规
private Set<String> picsPath; //照片
private String streetNumber;
private double length;
private String[] dataArray;
private Integer result;
public TransmissionPojo(CheckLog checkLog , Street street){
this.checkId = checkLog.getId().toString();
this.streetNumber = street.getPlcId();
this.taskId = checkLog.getLotnum();
this.row = checkLog.getRow();
this.column = checkLog.getColumn();
this.direction = checkLog.getDirection();
this.count = checkLog.getCount();
if(checkLog.getCategory() != null && checkLog.getCategory().contains("/")) {
this.category = checkLog.getCategory().split("/")[0];
}else {
this.category = checkLog.getCategory();
}
}
/**
* 30
@ -62,90 +36,19 @@ public class TransmissionPojo {
}
return numStr;
}
public TransmissionPojo( Street street,Integer row , Integer column,Integer direction,String orderId){
this.streetNumber = street.getPlcId();
this.row = row;
this.taskId = "0";
this.direction = direction;
this.column = column;
this.checkId = convertNumberToFixedLengthChars(row, 3) + convertNumberToFixedLengthChars(column, 3);
}
public String toString(TransmissionType type) {
this.header = type.toString();
if (type == TransmissionType.ST) {
return "ST&" + streetNumber + "&" + checkId + "&" + taskId + "&" + direction ;
}else if (type == TransmissionType.GPS) {
return "GPS&" + streetNumber +"/"+row +"/"+column+ "&" + checkId + "&" + taskId + "&" + direction+ "&" + category + "&" + count;
}else if (type == TransmissionType.RTS) {
return "RTS&" + streetNumber +"/"+row +"/"+column+ "&" + checkId + "&" + taskId + "&" + direction + "&" + category + "&" + count;
}
return "";
}
public TransmissionPojo(String data) {
this.data = data;
data = data.replace(">", "");
this.dataArray = data.split("&");
this.header = dataArray[0];
if(dataArray[1].contains("/")) {
String[] dataArr = dataArray[1].split("/");
this.streetNumber = dataArr[0];
this.row = Integer.valueOf(dataArr[1]);
if(dataArr.length > 2) {
this.column = Integer.valueOf(dataArr[2]);
}
}else {
this.streetNumber = dataArray[1];
}
if (dataArray.length > 2) {
this.checkId = dataArray[2];
this.taskId = (dataArray[3]);
if(dataArray[4] != null && !"".equals(dataArray[4]) && !"null".equals(dataArray[4])) {
this.direction = Integer.valueOf(dataArray[4]);
}
}
if (dataArray.length > 5) {
if(dataArray[5] != null &&!"".equals(dataArray[5]) && !"null".equals(dataArray[5]) ) {
this.dataArray = data.split(";");
this.category = dataArray[5];
}
if( dataArray.length > 6 && dataArray[6] != null && !"".equals(dataArray[6]) && ! "null".equals(dataArray[5])) {
this.count = Integer.valueOf(dataArray[6]);
}
}
if (dataArray.length > 7) {
this.result = Integer.parseInt(dataArray[7])==0 ?0:1;
//不记录2d图像
//String path2D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+this.direction+".jpg";
String path3D = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".PNG";
Set<String> strings = new HashSet<>();
//strings.add(path2D);
strings.add(path3D);
// 将数组中的元素添加到 Set 集合中
if(dataArray.length > 8 && dataArray[8].split(";").length>0) {
String[] s = dataArray[8].split(";");
for (int i = 0; i < s.length; i++) {
s[i] = s[i].replace("\\\\","/");
s[i] = s[i].replace("\\","/");
if(s[i].startsWith(".")) {
s[i] = s[i].replaceFirst(".", ""); // 移除单个字符
}
// 或者
// stringArray[i] = stringArray[i].replaceAll(regexToRemove, ""); // 使用正则表达式移除字符类别
}
Collections.addAll(strings,s);
strings.remove("");
}
this.picsPath = strings;
this.header = (dataArray[0]);
this.streetNumber = (dataArray[1]);
if (dataArray.length > 2) {
this.length = Double.parseDouble(dataArray[2]);
}
if(this.taskId != null && !"".equals(this.taskId) && this.checkId != null && !"".equals(this.checkId))
this.pcd = "/fileData/"+this.taskId+"/"+this.checkId+"/"+(this.direction+2)+".pcd";
}
public static void main(String[] args) {

@ -0,0 +1,74 @@
package com.zhehekeji.web.service.client.image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.LinkedBlockingQueue;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
public class ImageQueueReplacer {
private final String targetDirectory;
private final LinkedBlockingQueue<BufferedImage> imageQueue;
private final Semaphore semaphore;
private volatile boolean running = true;
public ImageQueueReplacer(String targetDirectory) {
this.targetDirectory = targetDirectory;
this.imageQueue = new LinkedBlockingQueue<>();
this.semaphore = new Semaphore(0); // 初始信号量为0
}
public void queueImage(BufferedImage image) {
imageQueue.add(image);
semaphore.release(); // 图片入队时释放信号量,告知有图片可处理
}
public void startAutoReplace(String imageName) {
Thread autoReplaceThread = new Thread(() -> {
while (running) {
try {
semaphore.acquire(); // 等待信号量,表明有图片或开始指令
BufferedImage imageToReplace;
while ((imageToReplace = imageQueue.poll()) != null) {
replaceImage(imageToReplace, imageName);
}
// 队列为空时,仅在第一次启动时执行覆盖(根据需求调整)
if (semaphore.availablePermits() == 0 && imageQueue.isEmpty()) {
replaceImage(null, imageName); // 使用null表示无图片可覆盖
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
});
autoReplaceThread.setDaemon(true);
autoReplaceThread.start();
}
private void replaceImage(BufferedImage image, String imageName) {
if (image != null) {
File outputFile = new File(targetDirectory, imageName);
try {
ImageIO.write(image, "jpg", outputFile);
System.out.println("Image saved: " + outputFile.getAbsolutePath());
} catch (IOException e) {
System.err.println("Error saving image: " + e.getMessage());
}
} else {
System.out.println("No image available to replace.");
}
}
public void stop() {
running = false;
}
}

@ -0,0 +1,28 @@
package com.zhehekeji.web.service.client.image;
import lombok.extern.slf4j.Slf4j;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
@Slf4j
public class ImageSaver {
private final String targetDirectory;
public ImageSaver(String targetDirectory) {
this.targetDirectory = targetDirectory;
}
public void saveImage(BufferedImage image, String imageName) {
File outputFile = new File(targetDirectory, imageName);
try {
ImageIO.write(image, "jpg", outputFile);
System.out.println("Image saved: " + outputFile.getAbsolutePath());
} catch (IOException e) {
System.err.println("Error saving image: " + e.getMessage());
}
}
}
Loading…
Cancel
Save