From 9504a620d015dcf4755b2c888724e99349ab5552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Thu, 5 Sep 2024 10:18:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0http=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E6=97=B6=E9=97=B4=20=E4=BF=AE=E6=94=B92d?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E7=9B=B4=E6=8E=A5=E8=AF=BB=E5=8F=96=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E4=B8=8B=E6=96=87=E4=BB=B6=20=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E9=98=88=E5=80=BC=E6=94=B9=E4=B8=BA0.6=20=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E5=B7=B7=E9=81=93=E6=A0=87=E8=AF=86=E7=AC=A6=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E5=88=99=E7=9B=B4=E6=8E=A5=E6=94=BE?= =?UTF-8?q?=E7=BD=AE00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/config/FusionDesignApplication.java | 5 +- .../IndustrialCameraController.java | 33 +++---- .../com/zhehekeji/web/service/PlcService.java | 54 +++++++---- .../zhehekeji/web/service/StockService.java | 13 ++- .../algorithm/FeatureMatchingExample.java | 16 +++- .../service/algorithm/InventoryService.java | 92 ++++++++++--------- .../web/service/ksec/KsecDecoder.java | 3 + 7 files changed, 128 insertions(+), 88 deletions(-) diff --git a/web/src/main/java/com/zhehekeji/web/config/FusionDesignApplication.java b/web/src/main/java/com/zhehekeji/web/config/FusionDesignApplication.java index 2114822..bb65011 100644 --- a/web/src/main/java/com/zhehekeji/web/config/FusionDesignApplication.java +++ b/web/src/main/java/com/zhehekeji/web/config/FusionDesignApplication.java @@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; +import java.time.Duration; @EnableAsync @EnableScheduling @@ -23,6 +24,8 @@ public class FusionDesignApplication { // 使用RestTemplateBuilder来实例化RestTemplate对象,spring默认已经注入了RestTemplateBuilder实例 @Bean public RestTemplate restTemplate() { - return builder.build(); + return builder.setConnectTimeout(Duration.ofSeconds(10)) // 设置连接超时时间,单位毫秒 + .setReadTimeout(Duration.ofSeconds(10)) // 设置读取超时时间,单位毫秒 + .build(); } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/IndustrialCameraController.java b/web/src/main/java/com/zhehekeji/web/controller/IndustrialCameraController.java index fd9aca4..0c14d02 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/IndustrialCameraController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/IndustrialCameraController.java @@ -60,34 +60,25 @@ public class IndustrialCameraController { String srcImg = configProperties.getSavePath().getMediaPath() + industrialCameraVo.getPicImg(); String srcImgRest = configProperties.getSavePath().getMediaPath() + industrialCameraVo.getPicImg(); //识别结果 - boolean macthBoolean = false; - for (ImgFile imgFile : industrialCameraVo.getFileList()){ - Mat template = null; - try { - template = base642Mat(imgFile.getThumbUrl().replace("data:image/jpeg;base64,","").replace("data:image/png;base64,","")); - } catch (IOException e) { - throw new RuntimeException(e); - } - if(FeatureMatchingExample.matchTemplate( template, Imgcodecs.imread(srcImgRest), srcImg+".jpg")){ - //识别成功后之后识别根据结果图识别 - if(!macthBoolean){ - srcImgRest = srcImg+".jpg"; - } - macthBoolean = true; - }else { - macthBoolean = false; - break; - } - } - if (macthBoolean){ + boolean re = FeatureMatchingExample.matchTemplate( + InventoryService.readImagesInFolder(configProperties.getSavePath().getMediaPath() + "template/" + industrialCameraVo.getTypeMacth()), + srcImg); + if (re){ - return new Result<>(srcImg+".jpg"); + return new Result<>(industrialCameraVo.getPicImg()+".jpg"); }else { return new Result<>(""); } } + + @ApiOperation("识别3D") + @PostMapping("Macth3D") + public Result Macth3D(@RequestBody IndustrialCameraVO industrialCameraVo){ + return null; + } + @Resource InventoryService inventoryService; diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index 5c4312e..defddaa 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -25,6 +25,7 @@ import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -1072,34 +1073,51 @@ public class PlcService { // 创建 HttpEntity 对象 HttpEntity entity = new HttpEntity<>(scTransmission, headers); - - // 发送 POST 请求 - ResponseEntity response = restTemplate.exchange( - "http://" + street.getPlcIp() + ":8099" + "/api/industrialCamera/matchFeatures", - HttpMethod.POST, - entity, - Boolean.class - ); - if (response.getStatusCode() == HttpStatus.OK) { - // 请求成功 - Boolean responseBody = response.getBody(); - System.out.println("获得的返回:" + responseBody); - if (Boolean.TRUE.equals(responseBody)) { - scTransmission.setResult(1); + try { + // 发送 POST 请求 + ResponseEntity response = restTemplate.exchange( + "http://" + street.getPlcIp() + ":8099" + "/api/industrialCamera/matchFeatures", + HttpMethod.POST, + entity, + Boolean.class + ); + if (response.getStatusCode() == HttpStatus.OK) { + // 请求成功 + Boolean responseBody = response.getBody(); + System.out.println("获得的返回:" + responseBody); + if (Boolean.TRUE.equals(responseBody)) { + scTransmission.setResult(1); + } else { + scTransmission.setResult(0); + } } else { - scTransmission.setResult(0); + // 请求失败 + System.out.println("请求失败,状态码:" + response.getStatusCode()); } - } else { - // 请求失败 - System.out.println("请求失败,状态码:" + response.getStatusCode()); + } catch (Exception e) { + scTransmission.setResult(0); + log.info("请求异常"); } + + } return scTransmission; } + public static void main(String[] args) { + RestTemplate restTemplate = new RestTemplateBuilder() + .setConnectTimeout(Duration.ofSeconds(2)) // 设置连接超时时间,单位毫秒 + .setReadTimeout(Duration.ofSeconds(2)) // 设置读取超时时间,单位毫秒 + .build(); + + // 使用restTemplate发起请求 + String response = restTemplate.getForObject("http://127.0.0.1:6000/example.com/api/data", String.class); + System.out.println(response); + } + public void visualInventory(SCTransmission scTransmission) { String[] location = scTransmission.getGoodsLocation().split("_"); Stock stock = stockMapper.getByStreetAndDirectionAndSideAndRowColumn( diff --git a/web/src/main/java/com/zhehekeji/web/service/StockService.java b/web/src/main/java/com/zhehekeji/web/service/StockService.java index 5742eb6..a2e4d05 100644 --- a/web/src/main/java/com/zhehekeji/web/service/StockService.java +++ b/web/src/main/java/com/zhehekeji/web/service/StockService.java @@ -413,8 +413,19 @@ public class StockService { stock.setOveroperationPic(stockLogs.get(0).getPic()); } else if (stockLogs.size() == 2) { stock.setOveroperationPic(stockLogs.get(0).getPic()); - stock.setPreoperationPic(stockLogs.get(1).getPic()); + } + String path2D = "http://" + street.getPlcIp() + ":8099/api/" + + "industrialCamera/" + + street.getPlcId() + "/" + + stock.getLotnum() + "/" + + stock.getId() + "/" + + stock.getRow() + "/" + + stock.getColumn() + "/" + + stock.getDirection().toString() + "/"; + //结果 + String filePath = path2D + street.getIndustrialCamera() + ".jpeg"; + stock.setPreoperationPic(filePath); StockStatus[] stockStatuses = StockStatus.values(); for (StockStatus stockStatus : stockStatuses){ if (stockStatus.getStatus() == stock.getStatusVision()){ diff --git a/web/src/main/java/com/zhehekeji/web/service/algorithm/FeatureMatchingExample.java b/web/src/main/java/com/zhehekeji/web/service/algorithm/FeatureMatchingExample.java index 419b131..094c165 100644 --- a/web/src/main/java/com/zhehekeji/web/service/algorithm/FeatureMatchingExample.java +++ b/web/src/main/java/com/zhehekeji/web/service/algorithm/FeatureMatchingExample.java @@ -86,18 +86,24 @@ public class FeatureMatchingExample { // 创建 URL 对象 //特征图 - Mat img2 = Imgcodecs.imread("E:\\m\\1\\Image_20240710110725304.bmp");;//原图 - Mat img1 = Imgcodecs.imread("E:\\m\\11.png"); + Mat img2 = Imgcodecs.imread("D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\aa20c309-7412-4392-88cd-aef08153f7c8 (2).jpeg");;//原图 + Mat img1 = Imgcodecs.imread("D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\aa20c309-7412-4392-88cd-aef08153f7c8.jpeg"); + + /* try { + img1 = base642Mat("data:image/png;base64,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".replace("data:image/jpeg;base64,","").replace("data:image/png;base64,","")); + } catch (IOException e) { + throw new RuntimeException(e); + }*/ // 生成特征图 Mat featureMap1 = generateFeatureMap(img1); - Imgcodecs.imwrite("E:\\m\\feature_map1.jpg", featureMap1); + Imgcodecs.imwrite("D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\feature_map1.jpg", featureMap1); // 检查两张图片是否匹配 boolean isMatched = matchFeatures(img1, img2); System.out.println("Images matched: " + isMatched); //FeatureOrbLannbased(img1, img2); - matchTemplate(img1, img2,"E:\\m\\2oooo.jpg"); + matchTemplate(img1, img2,"D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\2oooo.jpg"); // 裁剪图片 // Mat croppedImage = cropImage(img1, 100, 100, 200, 200); // Imgcodecs.imwrite("E:\\m\\3.png", croppedImage); @@ -237,7 +243,7 @@ public class FeatureMatchingExample { Imgproc.matchTemplate(grayImage, grayTemplate, result, Imgproc.TM_CCOEFF_NORMED); // 检测匹配的阈值 - double threshold = 0.75; // 根据需要调整此阈值 + double threshold = 0.6; // 根据需要调整此阈值 Mat mask = new Mat(); Core.compare(result, new Scalar(threshold), mask, Core.CMP_GT); diff --git a/web/src/main/java/com/zhehekeji/web/service/algorithm/InventoryService.java b/web/src/main/java/com/zhehekeji/web/service/algorithm/InventoryService.java index d9e0258..97444cc 100644 --- a/web/src/main/java/com/zhehekeji/web/service/algorithm/InventoryService.java +++ b/web/src/main/java/com/zhehekeji/web/service/algorithm/InventoryService.java @@ -15,6 +15,9 @@ import com.zhehekeji.web.service.client.TransmissionPojo; import com.zhehekeji.web.service.ksec.KsecInfo; import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.util.NativeLoader; +import lombok.extern.slf4j.Slf4j; +import org.opencv.core.Mat; +import org.opencv.imgcodecs.Imgcodecs; import org.springframework.boot.system.ApplicationHome; import org.springframework.stereotype.Service; @@ -31,7 +34,10 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; +import static com.zhehekeji.web.service.algorithm.FeatureMatchingExample.base642Mat; + @Service +@Slf4j public class InventoryService { @Resource StreetService streetService; @@ -63,11 +69,18 @@ public class InventoryService { //2d拍照并识别 if(street != null&& street.getIndustrialCamera()!=null){ cameraSaveUtil.saveImage(street.getIndustrialCamera(),path+street.getIndustrialCamera()+".jpeg","sn"); - boolean re = FeatureMatchingExample.matchTemplate( - readImagesInFolder( configProperties.getSavePath().getMediaPath()+"template/"+transmissionPojo.getCategory()), - path+street.getIndustrialCamera()+".jpeg"); - if(!re){ + log.info(street.getIndustrialCamera()+" 2d拍照路径:"+path+street.getIndustrialCamera()+".jpeg"); + if(transmissionPojo.getCategory()!=null && !transmissionPojo.getCategory().equals("")) { + boolean re = FeatureMatchingExample.matchTemplate( + readImagesInFolder(configProperties.getSavePath().getMediaPath() + "template/" + transmissionPojo.getCategory()), + path + street.getIndustrialCamera() + ".jpeg"); + log.info("2d识别结果:"+re); + if (!re) { + transmissionPojo.setResult(0); + } + }else { transmissionPojo.setResult(0); + log.info("未识别到任何模板"); } } @@ -84,14 +97,11 @@ public class InventoryService { String pcdPath4 =configProperties.getSavePath().getMediaPath() + street.getRight3D()+"/000/" +"/"+transmissionPojo.getRow()+"-"+transmissionPojo.getColumn()+"-"+transmissionPojo.getDirection()+"-R"+".pcd"; //拍照 - System.out.println("11 "+street.getLeft3D()+" : "+pcdPath1); + log.info("3D拍照 左侧pcd: "+street.getLeft3D()+" 右侧pcd:: "+pcdPath1); - System.out.println((System.getProperty("user.dir"))+"\\libs\\plc\\cameraapi"); - LxPointCloudSaveImage lxPointCloudSaveImage = new LxPointCloudSaveImage(); - lxPointCloudSaveImage.saveImage(street.getLeft3D(), pcdPath1,1); + LxPointCloudSaveImage.saveImage(street.getLeft3D(), pcdPath1,1); - LxPointCloudSaveImage lxPointCloudSaveImage2 = new LxPointCloudSaveImage(); - lxPointCloudSaveImage2.saveImage(street.getRight3D(), pcdPath2,2); + LxPointCloudSaveImage.saveImage(street.getRight3D(), pcdPath2,2); //左侧比较 PcdPojo pojo = new PcdPojo(); pojo.setPcd1(pcdPath1); @@ -99,7 +109,7 @@ public class InventoryService { pojo.setConfigPath("D://config//3DConfig/"+street.getLeft3D()+".json"); double leftScore = PointCloudProcessor.similarity(pojo,10); - System.out.println("3D leftScore:"+leftScore); + log.info("3D leftScore:"+leftScore); //右侧比较 pojo.setPcd1(pcdPath2); @@ -107,28 +117,12 @@ public class InventoryService { pojo.setConfigPath("D://config//3DConfig/"+street.getRight3D()+".json"); double rightScore = PointCloudProcessor.similarity( pojo,10); - //计算 - //拷贝 - try { - String directoryPath = "D://d/"+street.getLeft3D()+"/"; - File directory = new File(directoryPath); - - boolean created = directory.mkdirs(); - - String directoryPath2 = "D://d/"+street.getRight3D()+"/"; - File directory2 = new File(directoryPath2); - boolean created2 = directory2.mkdirs(); - Files.copy(Paths.get(pcdPath1), Paths.get("D://d/"+street.getLeft3D()+"/"+transmissionPojo.getCount()+"-"+ System.currentTimeMillis()+".pcd")); - Files.copy(Paths.get(pcdPath2), Paths.get("D://d/"+street.getRight3D()+"/"+transmissionPojo.getCount()+"-"+ System.currentTimeMillis()+".pcd")); - } catch (IOException e) { - throw new RuntimeException(e); - } - System.out.println("3D rightScore:"+rightScore); + log.info("3D rightScore:"+rightScore); if(leftScore<0.9||rightScore<0.9){ transmissionPojo.setResult(0); } - System.out.println(transmissionPojo.getResult()==0); + log.info("最终结果:"+transmissionPojo.getResult()); return !(transmissionPojo.getResult()==0); }; @@ -148,26 +142,40 @@ public class InventoryService { List list = new ArrayList<>(); // Check if the folder exists and is a directory if (!folder.exists() || !folder.isDirectory()) { - System.out.println(folderPath); - System.out.println("The specified path is not a valid directory."); + log.info(folderPath); + log.info("The specified path is not a valid directory."); return list; } - - // List all files in the folder that match the image filter File[] imageFiles = folder.listFiles(); for(File imageFile : imageFiles){ - list.add(imageFile.getAbsolutePath()); - } - - if (imageFiles != null) { - for (File imageFile : imageFiles) { - System.out.println("Found image: " + imageFile.getAbsolutePath()); - // You can process the image here, e.g., display it or convert it to a BufferedImage + if(!imageFile.isDirectory()) { + list.add(imageFile.getAbsolutePath()); + log.info("Found image: " + imageFile.getAbsolutePath()); } - } else { - System.out.println("No images found in the specified folder."); + log.info("Found file: " + imageFile.getAbsolutePath()); } + + return list; } + + public static void main(String[] args) { + Mat template = null; + try { + template = base642Mat("data:image/png;base64,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".replace("data:image/jpeg;base64,","").replace("data:image/png;base64,","")); + + + //Imgcodecs.imwrite("D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\aa20c30.jpeg", template); + + } catch (IOException e) { + throw new RuntimeException(e); + } + if(FeatureMatchingExample.matchTemplate( template, Imgcodecs.imread("D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\aa20c309-7412-4392-88cd-aef08153f7c8 (2).jpeg"), "D:\\WeChet\\WeChat Files\\wxid_ttkf0xgmyihv22\\FileStorage\\File\\2024-09\\1.jpg")){ + //识别成功后之后识别根据结果图识别 + + + } + System.out.println("1111"); + } } diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java index dd8c85c..89cee46 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java @@ -85,6 +85,9 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { // 去掉首尾标识符 body = body.substring(1, body.length()); KsecInfo ksecInfo = JSONObject.parseObject(body, KsecInfo.class); + if(ksecInfo.getData()!=null && ksecInfo.getData().getSRMNumber()!=null&& ksecInfo.getData().getSRMNumber().length() ==1){ + ksecInfo.getData().setSRMNumber("00"+ksecInfo.getData().getSRMNumber()); + } if (Cmd.A.name().equals(ksecInfo.getType())) { in.release(); return ;