開發與維運

視覺學習第四天

汽車檢測

開通服務

先要開通汽車檢測服務

導入依賴

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>objectdet</artifactId>
    <version>0.0.5</version>
</dependency>

<!--    圖片識別    -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>ocr</artifactId>
    <version>1.0.3</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.1.37</version>
</dependency>

實現

service

@Service
public class CarService {

    @Value("${car.accessKeyId}")
    private String accessKeyId;

    @Value("${car.accessKeySecret}")
    private String accessKeySecret;

    private Client objectClient;

    private RuntimeObject runtimeObject;


    @PostConstruct
    public void initClient() throws Exception {
        Config objectConfig = new Config();
        objectConfig.type = "access_key";
        objectConfig.regionId = "cn-shanghai";
        objectConfig.accessKeyId = accessKeyId;
        objectConfig.accessKeySecret = accessKeySecret;

        objectConfig.endpoint = "objectdet.cn-shanghai.aliyuncs.com";
        objectClient = new Client(objectConfig);
        runtimeObject = new RuntimeObject();
    }
    //識別分類圖片還未完成
    public String classifyVehicle(String filePath) throws Exception {
        ClassifyVehicleInsuranceAdvanceRequest request = new ClassifyVehicleInsuranceAdvanceRequest();
        request.imageURLObject = new FileInputStream(filePath);
        ClassifyVehicleInsuranceResponse response = objectClient.classifyVehicleInsuranceAdvance(request, runtimeObject);

        String result = null;

        for (ClassifyVehicleInsuranceResponse.ClassifyVehicleInsuranceResponseDataLabels item : response.data.labels){
            System.out.println(item.name + item.score);
        }

        return null;
    }


    public String myDetectVehicle(String filePath)throws Exception{
        DetectVehicleAdvanceRequest request = new DetectVehicleAdvanceRequest();
        request.imageURLObject = new FileInputStream(filePath);
        DetectVehicleResponse response = objectClient.detectVehicleAdvance(request, runtimeObject);

        String result = null;

        for (DetectVehicleResponse.DetectVehicleResponseDataDetectObjectInfoList item : response.data.detectObjectInfoList){
            System.out.println(item.type);
            System.out.println(item.score);

            if ("vehicle".equals(item.type)){
                System.out.println("檢測成功!是機動車");
            }else {
                System.out.println("該圖片不是機動車");
            }
           result =  item.type;
        }

        return result;
    }


    //車輛損傷識別
    public String myRecognizeVehicle(String filePath) throws Exception{
        //本地上傳圖片
        RecognizeVehicleDamageAdvanceRequest request = new RecognizeVehicleDamageAdvanceRequest();
        request.imageURLObject = new FileInputStream(filePath);

        //識別車輛損傷
        RecognizeVehicleDamageResponse response = objectClient.recognizeVehicleDamageAdvance(request, runtimeObject);

        return getHurtResult(response.data.elements);
    }

    public String getHurtResult(RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements[] items){

        StringBuffer type = new StringBuffer("檢測到的車輛損傷為:");
        for (RecognizeVehicleDamageResponse.RecognizeVehicleDamageResponseDataElements item: items){

            switch (item.type) {
                case "1": type.append("輕微刮擦   ");
                    break;
                case "2": type.append("重度刮擦   ");
                    break;
                case "3": type.append("輕度變形   ");
                    break;
                case "4": type.append("中度變形   ");
                    break;
                case "5": type.append("重度變形   ");
                    break;
                case "6": type.append("crack破損孔洞   ");
                    break;
                case "7": type.append("翼子板和大燈縫隙   ");
                    break;
                case "8": type.append("翼子板保險槓縫隙   ");
                    break;
                case "9": type.append("大燈輕微刮擦   ");
                    break;
                case "10": type.append("大燈重度刮擦   ");
                    break;
                case "11": type.append("大燈破損   ");
                    break;
                case "12": type.append("後視鏡輕微刮擦   ");
                    break;
                case "13": type.append("後視鏡玻璃破損   ");
                    break;
                case "14": type.append("後視鏡脫落   ");
                    break;
                case "15": type.append("擋風玻璃破損   ");
                    break;
            }
        }
        return type.toString();
    }


    public String fileUpload(MultipartFile file){
        //獲取文件名
        String uploadFileName = file.getOriginalFilename();

        //上傳路徑保存設置 UUID
        String path = "src/main/resources/static/upload";

        //如果路徑不存在,創建一個
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }

        //上傳文件,並保存
        InputStream is = null;
        OutputStream os = null;

        try {
            is = file.getInputStream();
            os = new FileOutputStream(new File(realPath,uploadFileName));
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) != -1){
                os.write(buffer,0,len);
                os.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return path +"\\"+uploadFileName;
    }
}

controller

@Controller
public class CarController {

    @Autowired
    private CarService carService;

    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("carfile")MultipartFile carfile,
    Model model)throws Exception{

        System.out.println("22222");

        //上傳受損車輛
        String carPath = carService.fileUpload(carfile);

        //調用Service層分析圖片
        String carStr = null;
        String carStr2 = null;

        //機動車檢測
        carStr = carService.myDetectVehicle(carPath);
        //車輛損傷識別
        carStr2 = carService.myRecognizeVehicle(carPath);

        //保存數據到數據庫中


        //將圖片路徑放入Model中
        String carFileName = carfile.getOriginalFilename();

        model.addAttribute("carfilename","/upload/"+carFileName);

        if ("vehicle".equals(carStr)){
            model.addAttribute("carStr","檢測成功!是機動車");
        }else {
            model.addAttribute("carStr","您上傳的圖片不是機動車,請重新上傳!!");
        }

        model.addAttribute("carStr2",carStr2);

        return "result";
    }


    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public String toResult(){

        return "test";
    }
}

前端

test

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form th:action="@{/upload}" enctype="multipart/form-data" method="post">

    受損車輛:<input type="file" name="carfile">
    <input type="submit" value="upload">
</form>
</body>
</html>

result

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <img th:src="${carfilename}">
    <p th:text="${carStr}"></p>
    <p th:text="${carStr2}"></p>
</body>
</html>

Leave a Reply

Your email address will not be published. Required fields are marked *