Witam,
długo już siedzę nad moim problemem, a rozwiązania znaleźć nie mogę. Tworzę program, który "przechodzi" po kilku zdjęciach, po czym wykrywa obiekty na nich się znajdujące. O ile na jednym zdjęciu radzi sobie świetnie, o tyle kiedy wrzucam to w pętlę, część kodu wykonuje się od razu, a część dopiero po czasie. Jest to spowodowane tym, że wykrycie obiektów na zdjęciach zajmuje trochę czasu. Jednak w mojej pętli console.log(imageNumber) wykonuje się jeden po drugim, a handleDetections potrzebuje na to więcej czasu, przez co wykrywane są obiekty tylko na ostatnim pliku. Jak mogę tu zaimplementować asynchroniczność, żeby działało jak chcę?
function filterDetections(detections){
let count = {};
for(const detection of detections) {
console.log(detection);
if(count[detection.label]){
count[detection.label] += 1;
}else {
count[detection.label] = 1;
}
}
return count;
}
function imageExists(image_url){
var http = new XMLHttpRequest();
http.open('HEAD', image_url, false);
http.send();
return http.status != 404;
}
let img;
let objectDetector;
let imageNumber = 0;
let imageDetections;
let JSONOutput = {};
let imageName;
let imageUrl;
async function setup(){
objectDetector = ml5.objectDetector('cocossd');
while(imageExists(`images/test${imageNumber}.jpg`)){
await detectOnImage(`images/test${imageNumber}.jpg`);
console.log(imageNumber);
imageNumber++;
}
}
function detectOnImage(url){
imageName = `test${imageNumber}.jpg`;
imageUrl = `images/test${imageNumber}.jpg`;
img = loadImage(url, imageLoaded);
}
function imageLoaded(){
console.log("imageLoaded");
img.resize(0, 520);
objectDetector.detect(img, handleDetections);
}
function handleDetections(err, results){
if(err){
console.error(err);
return;
}
imageDetections = results;
//JSON
let saveObject = {
detectoins: filterDetections(imageDetections)
}
JSONOutput[imageName] = saveObject;
}