samyolo / templates /v3_index.html
regisLik
deploy1
c9595c6
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Labélisation d'Images avec SAM</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<h1>Labélisation d'Images avec SAM</h1>
<div class="container">
<!-- Upload Section -->
<div class="upload-section">
<form method="post" enctype="multipart/form-data">
<label for="image">Télécharger une image :</label>
<input type="file" id="image" name="image" accept="image/*" required>
<button type="submit">Télécharger</button>
</form>
</div>
{% if uploaded_image %}
<!-- Display Uploaded Image -->
<canvas id="image-canvas"></canvas>
<!-- Class Management -->
<div class="class-management">
<h3>Ajouter une classe :</h3>
<input type="text" id="class-name" placeholder="Entrez une classe">
<button id="add-class">Ajouter</button>
<ul id="class-list"></ul>
</div>
<!-- Controls -->
<div class="controls">
<button id="segment-button" disabled>Lancer la Segmentation</button>
</div>
{% endif %}
</div>
<script>
let canvas = document.getElementById('image-canvas');
let ctx = canvas ? canvas.getContext('2d') : null;
let points = [];
let currentClass = null;
let img = null;
{% if uploaded_image %}
img = new Image();
img.src = "{{ url_for('static', filename='uploads/' + uploaded_image) }}";
img.onload = () => {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
};
// Activer ou désactiver le bouton de segmentation
function updateSegmentButtonState() {
const segmentButton = document.getElementById('segment-button');
if (points.length > 0) {
segmentButton.disabled = false; // Activer le bouton
} else {
segmentButton.disabled = true; // Désactiver le bouton
}
}
// Gestion des clics sur le canvas
canvas.addEventListener('click', event => {
const rect = canvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
if (!currentClass) {
alert('Veuillez sélectionner une classe avant d’ajouter des points.');
return;
}
// Ajouter le point
points.push({ x, y, class: currentClass });
// Dessiner le point sur le canvas
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(x, y, 5, 0, 2 * Math.PI);
ctx.fill();
// Mettre à jour l'état du bouton
updateSegmentButtonState();
});
// Ajouter une classe et la sélectionner
document.getElementById('add-class').addEventListener('click', () => {
const classNameInput = document.getElementById('class-name');
const className = classNameInput.value.trim();
if (!className) {
alert('Veuillez entrer une classe.');
return;
}
const classList = document.getElementById('class-list');
const li = document.createElement('li');
li.textContent = className;
li.classList.add('class-item');
li.addEventListener('click', () => {
document.querySelectorAll('.class-item').forEach(el => el.classList.remove('active'));
li.classList.add('active');
currentClass = className;
});
classList.appendChild(li);
classNameInput.value = '';
});
// Lancer la segmentation
document.getElementById('segment-button').addEventListener('click', () => {
const imageName = "{{ uploaded_image }}";
fetch('/segment', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
image_name: imageName,
points: points
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert('Segmentation réussie !');
} else {
alert('Erreur : ' + data.error);
}
})
.catch(error => {
console.error('Erreur lors de la segmentation :', error);
});
});
// Désactiver le bouton au chargement
updateSegmentButtonState();
{% endif %}
</script>
</body>
</html>