Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions client/dive-common/components/ConfidenceSubsection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ export default defineComponent({
type: Array as PropType<[string, number][]>,
required: true,
},
disabled: {
type: Boolean,
default: false,
},

},
setup() {
const typeStylingRef = useTypeStyling();
Expand Down Expand Up @@ -82,12 +87,35 @@ export default defineComponent({
}"
/>
</v-col>
<v-col class="type-item-value">
<v-col :cols="pair[1] !== 1 && !disabled ? '7' : '8'">
{{ pair[0] }}
</v-col>
<v-col class="type-score">
<v-spacer />
<v-col class="type-score shrink mr-1">
{{ pair[1].toFixed(4) }}
</v-col>
<v-col
v-if="pair[1] !== 1 && !disabled"
class="shrink"
>
<v-tooltip
open-delay="200"
bottom
>
<template #activator="{ bind, on }">
<v-btn
x-small
icon
v-bind="bind"
v-on="on"
@click="$emit('set-type', pair[0])"
>
<v-icon>mdi-check</v-icon>
</v-btn>
</template>
<span>Accept {{ pair[0] }} as correct type</span>
</v-tooltip>
</v-col>
</v-row>
</span>
</v-col>
Expand All @@ -97,19 +125,9 @@ export default defineComponent({

<style lang="scss">
.type-color-box {
margin-top: 5px;
min-width: 10px;
max-width: 10px;
min-height: 10px;
max-height: 10px;
}
.type-item-value {
max-width: 80%;
margin: 0px;
}
.type-score {
font-size: 1em;
max-width: 25%;
min-width: 25%;
}
</style>
55 changes: 55 additions & 0 deletions client/dive-common/components/ImageEnhancements.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<script lang="ts">
import { defineComponent, ref } from '@vue/composition-api';
import { useHandler, useImageEnhancements } from 'vue-media-annotator/provides';

export default defineComponent({
name: 'ImageEnhancements',
description: 'Image controls',
setup() {
const { setSVGFilters } = useHandler();
const imageEnhancements = useImageEnhancements();
const range = ref([
(imageEnhancements.value.blackPoint ?? 0) * 255.0,
(imageEnhancements.value.whitePoint ?? 1) * 255.0,
]);
const modifyValue = () => {
setSVGFilters({ blackPoint: range.value[0] / 255.0, whitePoint: range.value[1] / 255.0 });
};
return {
modifyValue,
range,
};
},
});
</script>

<template>
<div class="mx-4">
<span class="text-body-2">
Controls for adjusting images.
</span>
<v-divider class="my-3" />
<v-range-slider
v-model="range"
:min="0"
:max="255"
:step="1.0"
thumb-label="always"
label="Contrast:"
class="my-4"
@input="modifyValue"
/>
<v-btn
block
depressed
color="warning"
class="my-2"
@click="range = [0, 255]; modifyValue()"
>
Reset
</v-btn>
</div>
</template>

<style scoped>
</style>
2 changes: 2 additions & 0 deletions client/dive-common/components/TrackDetailsPanel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,8 @@ export default defineComponent({
:confidence-pairs="
flatten(selectedTrackList.map((t) => t.confidencePairs)).sort((a, b) => b[1] - a[1])
"
:disabled="selectedTrackList.length > 1"
@set-type="selectedTrackList[0].setType($event)"
/>
<attribute-subsection
v-if="!mergeInProgress"
Expand Down
14 changes: 13 additions & 1 deletion client/dive-common/components/Viewer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import type { AxiosError } from 'axios';
import Track, { TrackId } from 'vue-media-annotator/track';
import {
useAttributes,
useImageEnhancements,
useLineChart,
useStyling,
useTrackFilters,
Expand Down Expand Up @@ -125,6 +126,13 @@ export default defineComponent({
addCamera: addSaveCamera,
} = useSave(datasetId, readonlyState);

const {
imageEnhancements,
brightness,
intercept,
setSVGFilters,
} = useImageEnhancements();

const recipes = [
new PolygonBase(),
new HeadTail(),
Expand Down Expand Up @@ -553,6 +561,7 @@ export default defineComponent({
setSelectedCamera,
linkCameraTrack,
unlinkCameraTrack,
setSVGFilters,
};

provideAnnotator(
Expand Down Expand Up @@ -582,6 +591,7 @@ export default defineComponent({
time,
visibleModes,
readOnlyMode: readonlyState,
imageEnhancements,
},
globalHandler,
);
Expand Down Expand Up @@ -620,6 +630,8 @@ export default defineComponent({
originalFps: time.originalFps,
context,
readonlyState,
brightness,
intercept,
/* methods */
handler: globalHandler,
save,
Expand Down Expand Up @@ -829,7 +841,7 @@ export default defineComponent({
:class="{'selected-camera': selectedCamera === camera && camera !== 'singleCam'}"
v-bind="{
imageData: imageData[camera], videoUrl: videoUrl[camera],
updateTime, frameRate, originalFps, camera }"
updateTime, frameRate, originalFps, camera, brightness, intercept }"
>
<LayerManager :camera="camera" />
</component>
Expand Down
5 changes: 5 additions & 0 deletions client/dive-common/store/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import Install, { reactive } from '@vue/composition-api';
import Vue, { VueConstructor } from 'vue';
/* Components */
import TypeThreshold from 'dive-common/components/TypeThreshold.vue';
import ImageEnhancements from 'dive-common/components/ImageEnhancements.vue';
import MultiCamTools from 'dive-common/components/MultiCamTools.vue';

Vue.use(Install);
Expand All @@ -28,6 +29,10 @@ const componentMap: Record<string, ComponentMapItem> = {
description: 'Multicam Tools',
component: MultiCamTools,
},
ImageEnhancements: {
description: 'Image Enhancements',
component: ImageEnhancements,
},
};

function register(item: ComponentMapItem) {
Expand Down
2 changes: 2 additions & 0 deletions client/platform/desktop/frontend/components/ImportDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ export default defineComponent({
label="Annotation File (Optional)"
hint="Optional. Load existing annotations. Supports DIVE JSON and VIAME CSV"
persistent-hint
@input="argCopy.trackFileAbsPath = $event"
@click="openUpload('annotation')"
@click:prepend-inner="openUpload('annotation')"
@click:clear="argCopy.trackFileAbsPath=''"
Expand Down Expand Up @@ -227,6 +228,7 @@ export default defineComponent({
label="Configuration File (Optional)"
hint="Optional. Supports DIVE JSON configuration file."
persistent-hint
@input="argCopy.metaFileAbsPath = $event"
@click="openUpload('meta')"
@click:prepend-inner="openUpload('meta')"
@click:clear="argCopy.metaFileAbsPath=''"
Expand Down
7 changes: 7 additions & 0 deletions client/src/components/annotators/ImageAnnotator.vue
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ export default defineComponent({
type: String as PropType<string>,
default: 'singleCam',
},
intercept: {
type: Number as PropType<number | undefined>,
default: undefined,
},
},

setup(props) {
Expand Down Expand Up @@ -417,14 +421,17 @@ export default defineComponent({
<feFuncR
type="linear"
:slope="brightness"
:intercept="intercept"
/>
<feFuncG
type="linear"
:slope="brightness"
:intercept="intercept"
/>
<feFuncB
type="linear"
:slope="brightness"
:intercept="intercept"
/>
</feComponentTransfer>
</filter>
Expand Down
8 changes: 8 additions & 0 deletions client/src/components/annotators/VideoAnnotator.vue
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ export default defineComponent({
type: String as PropType<string>,
default: 'singleCam',
},
intercept: {
type: Number as PropType<number | undefined>,
default: undefined,
},

},

setup(props) {
Expand Down Expand Up @@ -301,14 +306,17 @@ export default defineComponent({
<feFuncR
type="linear"
:slope="brightness"
:intercept="intercept"
/>
<feFuncG
type="linear"
:slope="brightness"
:intercept="intercept"
/>
<feFuncB
type="linear"
:slope="brightness"
:intercept="intercept"
/>
</feComponentTransfer>
</filter>
Expand Down
24 changes: 20 additions & 4 deletions client/src/components/annotators/useMediaController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,15 +145,25 @@ export function useMediaController() {
allowCameraTrigger = false;
Object.entries(geoViewers).forEach(([camera, geoViewer]) => {
if (geoViewer.value && camera !== camEvent.camera) {
geoViewer.value.center(activeMap.center());
geoViewer.value.zoom(activeMap.zoom());
geoViewer.value.rotation(activeMap.rotation());
geoViewer.value.pan(camEvent.event.screenDelta);
}
});
allowCameraTrigger = true;
}
});

bus.$on('zoom', (camEvent: {camera: string; event: GeoEvent}) => {
const activeMap = geoViewers[camEvent.camera]?.value;
if (activeMap !== undefined && synchronizeCameras.value) {
allowCameraTrigger = false;
Object.entries(geoViewers).forEach(([camera, geoViewer]) => {
if (geoViewer.value && camera !== camEvent.camera) {
geoViewer.value.zoom(activeMap.zoom());
}
});
allowCameraTrigger = true;
}
});
/**
* This secondary initialization wrapper solves a sort of
* chicken-and-egg problem, allowing the function consumer to use
Expand Down Expand Up @@ -304,11 +314,17 @@ export function useMediaController() {

//Add in bus control synchronization for cameras
geoViewers[camera].value.geoOn(geo.event.pan, (e: GeoEvent) => {
// Only trigger if not handling other camera interactions.rrrrr
// Only trigger if not handling other camera interactions.
if (allowCameraTrigger) {
bus.$emit('pan', { camera: camera.toString(), event: e });
}
});
geoViewers[camera].value.geoOn(geo.event.zoom, (e: GeoEvent) => {
// Only trigger if not handling other camera interactions.
if (allowCameraTrigger) {
bus.$emit('zoom', { camera: camera.toString(), event: e });
}
});
}

function prevFrame() {
Expand Down
21 changes: 21 additions & 0 deletions client/src/components/controls/Controls.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
defineComponent, reactive, watch,
} from '@vue/composition-api';
import { usePrompt } from 'dive-common/vue-utilities/prompt-service';
import context from 'dive-common/store/context';
import { injectAggregateController } from '../annotators/useMediaController';

export default defineComponent({
Expand Down Expand Up @@ -42,12 +43,17 @@ export default defineComponent({
}
}

function toggleEnhancements() {
context.toggle('ImageEnhancements');
}

return {
data,
mediaController,
dragHandler,
input,
togglePlay,
toggleEnhancements,
visible,
};
},
Expand All @@ -62,6 +68,12 @@ export default defineComponent({
{ bind: 'space', handler: togglePlay, disabled: visible() },
{ bind: 'f', handler: mediaController.nextFrame, disabled: visible() },
{ bind: 'd', handler: mediaController.prevFrame, disabled: visible() },
{
bind: 'l',
handler: () => mediaController.toggleSynchronizeCameras(!mediaController.cameraSync.value),
disabled: visible(),
},

]"
>
<v-card
Expand Down Expand Up @@ -151,6 +163,15 @@ export default defineComponent({
>
<v-icon>mdi-image-filter-center-focus</v-icon>
</v-btn>
<v-btn
icon
small
title="Image Enhancements"
@click="toggleEnhancements"
>
<v-icon>mdi-contrast-box</v-icon>
</v-btn>

<v-btn
v-if="mediaController.cameras.value.length > 1"
icon
Expand Down
Loading