From 0d09bb5e96bf044ec0cc0556211d5a55f54bd9ec Mon Sep 17 00:00:00 2001 From: lukas Date: Wed, 5 Feb 2025 14:07:15 +0100 Subject: [PATCH] add image cropping --- observe_bact.html | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/observe_bact.html b/observe_bact.html index 08f280a..4f820bb 100644 --- a/observe_bact.html +++ b/observe_bact.html @@ -680,6 +680,9 @@ var cap = new cv.VideoCapture(video); let src = new cv.Mat(video.offsetHeight, video.offsetWidth, cv.CV_8UC4); let dst = new cv.Mat(video.offsetHeight, video.offsetWidth, cv.CV_8UC1); + let draw = new cv.Mat(video.offsetHeight, video.offsetWidth, cv.CV_8UC4); + + var rects_old_frame = []; var objects_last = []; let contours = new cv.MatVector(); @@ -692,16 +695,21 @@ function processVideo() { cap.read(src); + cap.read(draw); framecount+=1; let objects_this = []; let fits = []; let rects = []; + let areas = []; + let cropped_image = []; + try { if (!streaming) { // clean and stop. src.delete(); dst.delete(); + draw.delete(); return; } @@ -719,23 +727,42 @@ if (cv.contourArea(cnt) < 1000){ continue; } + // get the bounding rect of the contour let rect = cv.boundingRect(cnt); + //let rect = cv.minAreaRect(cnt) + + let cropped_ref = src.roi(rect); // prepare an array for fitnes values rects.push(rect); + let sample = new cv.Mat(rect.height, rect.width, cv.CV_8UC4); + cropped_ref.copyTo(sample); + cropped_image.push(sample); + + + + let area = cv.contourArea(cnt); + let s = src.size(); + s = microscope_setup.FoV_Width / s.width; + areas.push(area*Math.pow(s,2)); + let rectangleColor = new cv.Scalar(255, 0, 255,255); let point1 = new cv.Point(rect.x, rect.y); let point2 = new cv.Point(rect.x + rect.width, rect.y + rect.height); - cv.rectangle(src, point1, point2, rectangleColor, 2, cv.LINE_AA, 0); - - // get all fitness values for this rect. + //box = cv.boxPoints(rect); + //box = np.int0(box); + cv.rectangle(draw, point1, point2, rectangleColor, 2, cv.LINE_AA, 0); + //cv.drawContours(draw,[box],0,rectangleColor,2); + //console.log(rect); + // get all fitness values for this rect. first for already tracked rects for (let k = 0; k < objects_tracked.length; ++k){ if (objects_tracked[k].at(-1)[0] == framecount-1){ fits.push([k, 'NaN', rects.length-1, fit(objects_tracked[k].at(-1)[1], rect)]); } } + // get all fitness values for rects that have not been tracked. for (let j = 0; j < objects_last.length; ++j){ - fits.push(['NaN', j, rects.length-1, fit(objects_last[j], rect)]); + fits.push(['NaN', j, rects.length-1, fit(objects_last[j][1], rect)]); } } // sort fits array @@ -756,12 +783,12 @@ break; } else if (ind_new == 'NaN' && !(objects_tracked_handled.has(ind_tracked)) && !(rects_handled.has(ind_rect))){ - objects_tracked[ind_tracked].push([framecount, rects[ind_rect]]); + objects_tracked[ind_tracked].push([framecount, rects[ind_rect], cropped_image[ind_rect], areas[ind_rect]]); objects_tracked_handled.add(ind_tracked); rects_handled.add(ind_rect); let rectangleColor = new cv.Scalar(255, 0, 255,255); point1 = new cv.Point(rects[ind_rect].x, rects[ind_rect].y); - cv.putText(src, String(ind_tracked+objects_lost.length), point1, cv.FONT_HERSHEY_COMPLEX, 1, rectangleColor, 1, cv.LINE_8); + cv.putText(draw, String(ind_tracked), point1, cv.FONT_HERSHEY_COMPLEX, 1, rectangleColor, 1, cv.LINE_8); } } @@ -776,14 +803,15 @@ break; } else if (ind_tracked == 'NaN' && !(objects_new_handled.has(ind_new)) && !(rects_handled.has(ind_rect))){ - objects_tracked.push([[framecount-1, objects_last[ind_new]], [framecount, rects[ind_rect]]]); + objects_tracked.push([objects_last[ind_new], [framecount, rects[ind_rect], cropped_image[ind_rect], areas[ind_rect]]]); + add_organism_candidate(objects_last[ind_new], objects_tracked.length); objects_new_handled.add(ind_new); rects_handled.add(ind_rect); } } for (let i = 0; i < rects.length; ++i){ if (!(rects_handled.has(i))) { - objects_this.push(rects[i]); + objects_this.push([framecount, rects[i], cropped_image[i], areas[i]]); } }