24282 hai 1 ano
pai
achega
eb63c0bc87

+ 7 - 0
pom.xml

@@ -24,6 +24,7 @@
         <module>sd-business</module>
         <module>code-generation</module>
         <module>sd-wln</module>
+        <module>sd-vision</module>
     </modules>
 
     <parent>
@@ -60,6 +61,12 @@
                 <version>${sd.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.sd</groupId>
+                <artifactId>sd-vision</artifactId>
+                <version>${sd.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 33 - 0
sd-vision/pom.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sd</groupId>
+        <artifactId>shdy_project</artifactId>
+        <version>2.0</version>
+    </parent>
+
+    <artifactId>sd-vision</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.sd</groupId>
+            <artifactId>MvCameraControlWrapper</artifactId>
+            <version>1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sd</groupId>
+            <artifactId>sd-business</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 119 - 0
sd-vision/src/main/java/com/sd/vision/Main.java

@@ -0,0 +1,119 @@
+package com.sd.vision;
+
+import MvCameraControlWrapper.MvCameraControl;
+import cn.hutool.core.io.FileUtil;
+
+import java.util.ArrayList;
+
+import static MvCameraControlWrapper.MvCameraControl.MV_CC_EnumDevices;
+import static MvCameraControlWrapper.MvCameraControlDefines.*;
+
+public class Main {
+    public static void main(String[] args) {
+
+        Handle hCamera = null;
+        int nRet;
+
+        try {
+            ArrayList<MV_CC_DEVICE_INFO> stDeviceList = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE);
+            if (stDeviceList.isEmpty()) {
+                System.err.println("没有发现设备");
+                return;
+            }
+            if (stDeviceList.size() > 1) {
+                System.err.println("发现多台设备");
+                return;
+            }
+            MV_CC_DEVICE_INFO mvCcDeviceInfo = stDeviceList.get(0);
+
+            hCamera = MvCameraControl.MV_CC_CreateHandle(mvCcDeviceInfo);
+
+            // 打开设备
+            nRet = MvCameraControl.MV_CC_OpenDevice(hCamera);
+            if (MV_OK != nRet) {
+                System.err.printf("连接摄像机失败, errCode: [%#x]", nRet);
+                return;
+            }
+
+            // 确保触发模式是关闭的
+            nRet = MvCameraControl.MV_CC_SetEnumValueByString(hCamera, "TriggerMode", "Off");
+            if (MV_OK != nRet) {
+                System.err.printf("触发方式设置失败, errCode: [%#x]\n", nRet);
+                return;
+            }
+
+            // 获取有效负载大小
+            MVCC_INTVALUE stParam = new MVCC_INTVALUE();
+            nRet = MvCameraControl.MV_CC_GetIntValue(hCamera, "PayloadSize", stParam);
+            if (MV_OK != nRet) {
+                System.err.printf("获取有效载荷大小失败, errCode: [%#x]\n", nRet);
+                return;
+            }
+
+            // 开始抓取图片
+            nRet = MvCameraControl.MV_CC_StartGrabbing(hCamera);
+            if (MV_OK != nRet) {
+                System.err.printf("开始抓取失败, errCode: [%#x]\n", nRet);
+                return;
+            }
+
+            // 保存图片
+            saveImg(hCamera, stParam, "D://test222222.jpeg");
+
+            // 停止抓取图片
+            nRet = MvCameraControl.MV_CC_StopGrabbing(hCamera);
+            if (MV_OK != nRet) {
+                System.err.printf("停止抓取失败, errCode: [%#x]\n", nRet);
+                return;
+            }
+        } catch (Exception e) {
+            if (null != hCamera) {
+                // 销毁处理
+                nRet = MvCameraControl.MV_CC_DestroyHandle(hCamera);
+                if (MV_OK != nRet) {
+                    System.err.printf("销毁句柄失败, errCode: [%#x]\n", nRet);
+                }
+            }
+        }
+
+        System.out.println();
+    }
+
+
+    private static void saveImg(Handle hCamera, MVCC_INTVALUE stParam, String path) {
+        // 得到一帧图片
+        MV_FRAME_OUT_INFO stImageInfo = new MV_FRAME_OUT_INFO();
+        byte[] pData = new byte[(int) stParam.curValue];
+        int nRet = MvCameraControl.MV_CC_GetOneFrameTimeout(hCamera, pData, stImageInfo, 1000);
+        if (MV_OK != nRet) {
+            System.err.printf("得到一帧图片失败, errCode:[%#x]\n", nRet);
+            return;
+        }
+
+        // 每个RGB像素占用3个字节
+        int imageLen = stImageInfo.width * stImageInfo.height * 3;
+        byte[] imageBuffer = new byte[imageLen];
+
+        // 调用MV_CC_SaveImage将图像保存为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("保存图片失败, errCode: [%#x]\n", nRet);
+            return;
+        }
+
+        // 将缓冲区内容保存到文件
+        FileUtil.writeBytes(imageBuffer, path);
+    }
+
+}

+ 1 - 11
sd-wln/src/main/java/com/sd/wln/controller/WlnController.java

@@ -6,14 +6,10 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
 @RestController
 @RequestMapping("/wln")
 public class WlnController {
 
-    public static final Lock syncSkuLock = new ReentrantLock();
 
     @Autowired
     private WlnSkuService wlnSkuService;
@@ -23,13 +19,7 @@ public class WlnController {
      */
     @PostMapping("/syncSku")
     public void syncSku() {
-        if (syncSkuLock.tryLock()) {
-            try {
-                wlnSkuService.sync();
-            } finally {
-                WlnController.syncSkuLock.unlock();
-            }
-        }
+        wlnSkuService.sync();
     }
 
 }

+ 1 - 8
sd-wln/src/main/java/com/sd/wln/scheduled/WlnSyncTask.java

@@ -1,6 +1,5 @@
 package com.sd.wln.scheduled;
 
-import com.sd.wln.controller.WlnController;
 import com.sd.wln.service.WlnSkuService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Profile;
@@ -22,13 +21,7 @@ public class WlnSyncTask {
      */
     @Scheduled(cron = "0 0 1 * * ?")
     public void syncSku() {
-        if (WlnController.syncSkuLock.tryLock()) {
-            try {
-                wlnSkuService.sync();
-            } finally {
-                WlnController.syncSkuLock.unlock();
-            }
-        }
+        wlnSkuService.sync();
     }
 
 }

+ 17 - 5
sd-wln/src/main/java/com/sd/wln/service/impl/WlnSkuServiceImpl.java

@@ -24,6 +24,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -31,6 +33,8 @@ import java.util.stream.Collectors;
 @Service
 public class WlnSkuServiceImpl implements WlnSkuService {
 
+    public static final Lock syncSkuLock = new ReentrantLock();
+
     @Autowired
     private SkuClassifyService skuClassifyService;
 
@@ -43,8 +47,14 @@ public class WlnSkuServiceImpl implements WlnSkuService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void sync() {
-        syncSkuClassify();
-        syncSku();
+        if (syncSkuLock.tryLock()) {
+            try {
+                syncSkuClassify();
+                syncSku();
+            } finally {
+                syncSkuLock.unlock();
+            }
+        }
     }
 
     private void syncSkuClassify() {
@@ -97,8 +107,10 @@ public class WlnSkuServiceImpl implements WlnSkuService {
 
     private void syncSku() {
         Sku tempSku = skuService.getOne(q -> q.orderByDesc(BasePo::getUpdateTime));
-        Long modifyTime = 965381503L;
-        if (tempSku != null) {
+        Long modifyTime;
+        if (tempSku == null) {
+            modifyTime = 965381503L;
+        } else {
             modifyTime = tempSku.getUpdateTime().getTime() + 1;
         }
 
@@ -108,9 +120,9 @@ public class WlnSkuServiceImpl implements WlnSkuService {
         do {
             try {
                 List<JSONObject> itemList = WlnUtil.getSkuList(page, 200, modifyTime);
+                wlnSkuList.addAll(itemList);
                 page++;
                 size = itemList.size();
-                wlnSkuList.addAll(itemList);
             } catch (Exception e) {
                 log.error("sku同步失败", e);
                 throw new ServiceException("sku同步失败");