|
<!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"> |
|
|
|
<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 %} |
|
|
|
<canvas id="image-canvas"></canvas> |
|
|
|
|
|
<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> |
|
|
|
|
|
<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); |
|
}; |
|
|
|
|
|
function updateSegmentButtonState() { |
|
const segmentButton = document.getElementById('segment-button'); |
|
if (points.length > 0) { |
|
segmentButton.disabled = false; |
|
} else { |
|
segmentButton.disabled = true; |
|
} |
|
} |
|
|
|
|
|
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; |
|
} |
|
|
|
|
|
points.push({ x, y, class: currentClass }); |
|
|
|
|
|
ctx.fillStyle = 'red'; |
|
ctx.beginPath(); |
|
ctx.arc(x, y, 5, 0, 2 * Math.PI); |
|
ctx.fill(); |
|
|
|
|
|
updateSegmentButtonState(); |
|
}); |
|
|
|
|
|
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 = ''; |
|
}); |
|
|
|
|
|
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); |
|
}); |
|
}); |
|
|
|
|
|
updateSegmentButtonState(); |
|
{% endif %} |
|
</script> |
|
|
|
</body> |
|
</html> |
|
|