Compare commits

...

5 Commits

Author SHA1 Message Date
longguancheng
f775c6f173 Merge branch 'refs/heads/main' into dev_20260130_RemoveRedis
# Conflicts:
#	backend/Skyeye-sys-dev/skyeye-service-manager/src/main/java/com/zhangy/skyeye/jm/controller/JmImageController.java
2026-02-05 15:51:47 +08:00
wxs
41ca97a2f3 修改参数 2026-02-05 15:35:27 +08:00
wxs
a372b06c2a Merge branch 'main' of http://182.92.203.107:3000/libingkun/skyeyesystem 2026-02-05 15:20:57 +08:00
wxs
246711a427 修改message样式,增加巡航模式,亮度设置功能 2026-02-05 15:20:21 +08:00
1e019bcdab bug: wave3: ticket#7, reference opencv dll from relative library path. 2026-02-05 14:21:38 +08:00
10 changed files with 118 additions and 48 deletions

View File

@ -11,13 +11,12 @@ import com.zhangy.skyeye.jm.entity.JmImage;
import com.zhangy.skyeye.jm.service.JmImageService; import com.zhangy.skyeye.jm.service.JmImageService;
import com.zhangy.skyeye.publics.consts.FileTypeEnum; import com.zhangy.skyeye.publics.consts.FileTypeEnum;
import com.zhangy.skyeye.publics.utils.LocalLockUtil; import com.zhangy.skyeye.publics.utils.LocalLockUtil;
import org.opencv.core.Core; import com.zhangy.skyeye.publics.utils.OpenCVUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.File;
import java.net.ConnectException; import java.net.ConnectException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -120,21 +119,7 @@ public class JmImageController {
static { static {
//System.loadLibrary(Core.NATIVE_LIBRARY_NAME); //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//加载 OpenCV (强制使用绝对路径加载解决 UnsatisfiedLinkError) OpenCVUtil.loadNativeDylib();
String openCvDll = System.getProperty("opencv.library.path") + File.separator + Core.NATIVE_LIBRARY_NAME + ".dll";
try {
File dllFile = new File(openCvDll);
if (dllFile.exists()) {
// 注意必须使用 System.load() 加载绝对路径
System.load(dllFile.getAbsolutePath());
System.out.println("SUCCESS: OpenCV loaded from -> " + dllFile.getAbsolutePath());
} else {
System.err.println("ERROR: OpenCV DLL not found at -> " + openCvDll);
}
} catch (Throwable e) {
System.err.println("CRITICAL: Failed to load OpenCV: " + e.getMessage());
e.printStackTrace();
}
} }
/*@IgnoreAuth /*@IgnoreAuth

View File

@ -24,7 +24,8 @@ import java.util.List;
public class ImageUtil { public class ImageUtil {
static { static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
OpenCVUtil.loadNativeDylib();
} }
/** /**

View File

@ -19,7 +19,26 @@ import java.util.List;
public class OpenCVUtil { public class OpenCVUtil {
static { static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
loadNativeDylib();
}
public static void loadNativeDylib() {
//加载 OpenCV (强制使用绝对路径加载解决 UnsatisfiedLinkError)
String openCvDll = System.getProperty("opencv.library.path") + File.separator + Core.NATIVE_LIBRARY_NAME + ".dll";
try {
File dllFile = new File(openCvDll);
if (dllFile.exists()) {
// 注意必须使用 System.load() 加载绝对路径
System.load(dllFile.getAbsolutePath());
System.out.println("SUCCESS: OpenCV loaded from -> " + dllFile.getAbsolutePath());
} else {
System.err.println("ERROR: OpenCV DLL not found at -> " + openCvDll);
}
} catch (Throwable e) {
System.err.println("CRITICAL: Failed to load OpenCV: " + e.getMessage());
e.printStackTrace();
}
} }
/** /**

View File

@ -22,10 +22,14 @@ const state = {
label: '快速模式', label: '快速模式',
value: '1' value: '1'
}, },
{
label: '巡航模式',
value: '2'
},
{ {
label: '创建航线', label: '创建航线',
value: '3' value: '3'
} },
], ],
polarization: {}, polarization: {},
polarizationOptions: {}, polarizationOptions: {},

View File

@ -760,6 +760,7 @@
------------------------------------- */ ------------------------------------- */
.el-message { .el-message {
border: none; border: none;
top: 60px !important;
// &[class*='success'] { // &[class*='success'] {
// background-color: rgba(mix(#000, $--color-green, 30%), 0.7); // background-color: rgba(mix(#000, $--color-green, 30%), 0.7);

View File

@ -1296,7 +1296,7 @@ export default {
name: params.name, name: params.name,
mode: params.mode, mode: params.mode,
pointList: pointList, pointList: pointList,
startAltitude: params.startAltitude, startAltitude: params.mode === '2' ? 0 : params.startAltitude,
imageLight: parseFloat(params.imageLight), imageLight: parseFloat(params.imageLight),
headingDiff: parseFloat(params.headingDiff), headingDiff: parseFloat(params.headingDiff),
imageBit: parseFloat(params.imageBit), imageBit: parseFloat(params.imageBit),
@ -1305,20 +1305,16 @@ export default {
uavList: [ uavList: [
{ {
uavId: params.uav, uavId: params.uav,
// startLon: params.startPoint.lon, speed: params.mode === '2' ? 0 : params.initSpeed,
// startLat: params.startPoint.lat, height: params.mode === '2' ? 0 : params.flyHeight,
// endLon: params.endPoint.lon,
// endLat: params.endPoint.lat,
speed: params.initSpeed,
height: params.flyHeight,
resolution: params.ratio, resolution: params.ratio,
startAltitude: params.startAltitude, startAltitude: params.mode === '2' ? 0 : params.startAltitude,
payloadList: [{ payloadList: [{
payloadId: params.loader, payloadId: params.loader,
resolution: params.ratio, resolution: params.ratio,
width: params.width, width: params.width,
length: this.form.imageMode === '4' ? this.ratioMap.gmti.length : this.ratioMap[params.ratio].length, length: this.form.imageMode === '4' ? this.ratioMap.gmti.length : this.ratioMap[params.ratio].length,
theta: params.theta, theta: params.mode === '2' ? 0 : params.theta,
reserved: this.form.imageMode === '4' ? this.ratioMap.gmti.reserved : this.ratioMap[params.ratio].reserved, reserved: this.form.imageMode === '4' ? this.ratioMap.gmti.reserved : this.ratioMap[params.ratio].reserved,
direction: params.direction, direction: params.direction,
polarization: params.polarization, polarization: params.polarization,
@ -2001,7 +1997,7 @@ export default {
name: params.name, name: params.name,
mode: params.mode, mode: params.mode,
pointList: pointList, pointList: pointList,
startAltitude: params.startAltitude, startAltitude: params.mode === '2' ? 0 : params.startAltitude,
imageLight: parseFloat(params.imageLight), imageLight: parseFloat(params.imageLight),
headingDiff: parseFloat(params.headingDiff), headingDiff: parseFloat(params.headingDiff),
imageBit: parseFloat(params.imageBit), imageBit: parseFloat(params.imageBit),
@ -2010,16 +2006,16 @@ export default {
uavList: [ uavList: [
{ {
uavId: params.uav, uavId: params.uav,
speed: params.initSpeed, speed: params.mode === '2' ? 0 : params.initSpeed,
height: params.flyHeight, height: params.mode === '2' ? 0 : params.flyHeight,
resolution: params.ratio, resolution: params.ratio,
startAltitude: params.startAltitude, startAltitude: params.mode === '2' ? 0 : params.startAltitude,
payloadList: [{ payloadList: [{
payloadId: params.loader, payloadId: params.loader,
resolution: params.ratio, resolution: params.ratio,
width: params.width, width: params.width,
length: this.form.imageMode === '4' ? this.ratioMap.gmti.length : this.ratioMap[params.ratio].length, length: this.form.imageMode === '4' ? this.ratioMap.gmti.length : this.ratioMap[params.ratio].length,
theta: params.theta, theta: params.mode === '2' ? 0 : params.theta,
reserved: this.form.imageMode === '4' ? this.ratioMap.gmti.reserved : this.ratioMap[params.ratio].reserved, reserved: this.form.imageMode === '4' ? this.ratioMap.gmti.reserved : this.ratioMap[params.ratio].reserved,
direction: params.direction, direction: params.direction,
polarization: params.polarization, polarization: params.polarization,

View File

@ -303,7 +303,11 @@
</el-table> </el-table>
</div>--> </div>-->
<el-form-item prop="startAltitude" label="起飞点高度"> <el-form-item
v-if="form.mode !== '2'"
prop="startAltitude"
label="起飞点高度"
>
<div class="input-command"> <div class="input-command">
<el-input <el-input
v-model.number="form.startAltitude" v-model.number="form.startAltitude"
@ -391,7 +395,11 @@
<!-- </el-select>--> <!-- </el-select>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item prop="initSpeed" label="飞行速度"> <el-form-item
v-if="form.mode !== '2'"
prop="initSpeed"
label="飞行速度"
>
<!-- <el-input--> <!-- <el-input-->
<!-- v-model.number="form.initSpeed"--> <!-- v-model.number="form.initSpeed"-->
<!-- type="number"--> <!-- type="number"-->
@ -481,14 +489,11 @@
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="flyHeight" label="飞行高度"> <el-form-item
<!-- <el-input--> v-if="form.mode !== '2'"
<!-- @change="calculateWidth"--> prop="flyHeight"
<!-- v-model.number="form.flyHeight"--> label="飞行高度"
<!-- type="number"--> >
<!-- size="small"-->
<!-- placeholder="请输入飞行高度"-->
<!-- ></el-input>-->
<el-slider <el-slider
v-model="form.flyHeight" v-model="form.flyHeight"
show-input show-input
@ -497,9 +502,8 @@
:max="500" :max="500"
size="mini" size="mini"
></el-slider> ></el-slider>
<!-- <el-input-number @change="calculateWidth" v-model="form.flyHeight" controls-position="right" :min="50" :max="500"></el-input-number>-->
</el-form-item> </el-form-item>
<el-form-item label="下视角"> <el-form-item v-if="form.mode !== '2'" label="下视角">
<el-slider <el-slider
v-model="form.theta" v-model="form.theta"
:step="0.1" :step="0.1"

View File

@ -27,7 +27,7 @@ import UavTarget from './uavTarget'
import PicturesUpload from '../pictures-upload/index.vue' import PicturesUpload from '../pictures-upload/index.vue'
import RightSlide from '@/components/RightSlide.vue' import RightSlide from '@/components/RightSlide.vue'
import LeftSlide from '@/components/LeftSlide.vue' import LeftSlide from '@/components/LeftSlide.vue'
import { debounce } from '@/utils'
let handler = undefined let handler = undefined
let broadcastChannel = null let broadcastChannel = null
let broadcastChannelInterval = null let broadcastChannelInterval = null
@ -394,7 +394,9 @@ export default {
title: '航线详情', title: '航线详情',
data: [] data: []
}, },
emptyImg: require('@/assets/img/common/empty.svg') emptyImg: require('@/assets/img/common/empty.svg'),
lightPercent: 10,
contrastPercent: 10
} }
}, },
computed: { computed: {
@ -584,6 +586,10 @@ export default {
return '#336dff' return '#336dff'
} }
}, },
// 亮度设置变化
onLightChange: debounce(function (value) {
}, 200),
// startTest() { // startTest() {
// let testHeight = 1000 // let testHeight = 1000
// window.detectType = { // window.detectType = {

View File

@ -1322,3 +1322,34 @@
} }
} }
} }
.image-set {
position: absolute;
left: 50%;
top: calc(100vh - 60px);
width: 360px;
transform: translateX(-50%);
background-color: $--color-black-1-alpha;
padding: 6px 10px;
border-radius: 6px;
::v-deep .el-slider__input {
width: 80px;
}
::v-deep .el-slider__runway {
width: 200px;
margin-right: 100px;
}
&__item {
display: flex;
align-items: center;
.is-label {
flex: none;
color: $--color-text-1;
width: 60px;
}
}
}

View File

@ -132,6 +132,29 @@
</div> </div>
</dt-card> </dt-card>
</left-slide> </left-slide>
<div class="image-set" v-if="taskList.visible && taskList.data.length">
<div class="image-set__item">
<div class="is-label">亮度</div>
<el-slider
v-model="lightPercent"
show-input
input-size="mini"
:show-input-controls="false"
@input="onLightChange"
>
</el-slider>
</div>
<!-- <div class="image-set__item">
<div class="is-label">对比度</div>
<el-slider
v-model="contrastPercent"
show-input
input-size="mini"
:show-input-controls="false"
>
</el-slider>
</div> -->
</div>
<!-- 图片上传 --> <!-- 图片上传 -->
<pictures-upload <pictures-upload