From 187de97ae4f5eab845113c9a8202e806a0b53c93 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Tue, 6 Jun 2006 04:37:22 +0000 Subject: Applied patch #1501375 (bzr r1164) --- src/trace/siox.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 98 insertions(+), 7 deletions(-) (limited to 'src/trace/siox.cpp') diff --git a/src/trace/siox.cpp b/src/trace/siox.cpp index 752a14460..b0632567c 100644 --- a/src/trace/siox.cpp +++ b/src/trace/siox.cpp @@ -655,9 +655,19 @@ const float Siox::CERTAIN_BACKGROUND_CONFIDENCE=0.0f; */ Siox::Siox() { + sioxObserver = NULL; init(); } +/** + * Construct a Siox engine + */ +Siox::Siox(SioxObserver *observer) +{ + init(); + sioxObserver = observer; +} + /** * @@ -704,6 +714,27 @@ void Siox::trace(char *fmt, ...) +/** + * Progress reporting + */ +bool Siox::progressReport(float percentCompleted) +{ + if (!sioxObserver) + return true; + + bool ret = sioxObserver->progress(percentCompleted); + + if (!ret) + { + trace("User selected abort"); + keepGoing = false; + } + + return ret; +} + + + /** * Extract the foreground of the original image, according @@ -713,6 +744,7 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, unsigned int backgroundFillColor) { init(); + keepGoing = true; SioxImage workImage = originalImage; @@ -729,17 +761,28 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, //#### create color signatures std::vector knownBg; std::vector knownFg; - for (int x = 0 ; x < workImage.getWidth() ; x++) - for (int y = 0 ; y < workImage.getHeight() ; y++) + std::vector imageClab; + for (int y = 0 ; y < workImage.getHeight() ; y++) + for (int x = 0 ; x < workImage.getWidth() ; x++) { float cm = workImage.getConfidence(x, y); unsigned int pix = workImage.getPixel(x, y); + CLAB lab(pix); + imageClab.push_back(lab); if (cm <= BACKGROUND_CONFIDENCE) - knownBg.push_back(pix); //note: uses CLAB(rgb) + knownBg.push_back(lab); //note: uses CLAB(rgb) else if (cm >= FOREGROUND_CONFIDENCE) - knownFg.push_back(pix); + knownFg.push_back(lab); } + if (!progressReport(10.0)) + { + error("User aborted"); + workImage.setValid(false); + delete[] labelField; + return workImage; + } + trace("knownBg:%d knownFg:%d", knownBg.size(), knownFg.size()); @@ -748,14 +791,25 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, { error("Could not create background signature"); workImage.setValid(false); + delete[] labelField; + return workImage; + } + + if (!progressReport(30.0)) + { + error("User aborted"); + workImage.setValid(false); + delete[] labelField; return workImage; } + + std::vector fgSignature ; if (!colorSignature(knownFg, fgSignature, 3)) { error("Could not create foreground signature"); - delete[] labelField; workImage.setValid(false); + delete[] labelField; return workImage; } @@ -765,17 +819,41 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, { // segmentation impossible error("Signature size is < 1. Segmentation is impossible"); + workImage.setValid(false); delete[] labelField; + return workImage; + } + + if (!progressReport(30.0)) + { + error("User aborted"); workImage.setValid(false); + delete[] labelField; return workImage; } + // classify using color signatures, // classification cached in hashmap for drb and speedup purposes std::map hs; + + unsigned int progressResolution = pixelCount / 10; for (unsigned int i=0; i= FOREGROUND_CONFIDENCE) { cm[i] = CERTAIN_FOREGROUND_CONFIDENCE; @@ -795,7 +873,7 @@ SioxImage Siox::extractForeground(const SioxImage &originalImage, } else { - CLAB lab(image[i]); + CLAB lab = imageClab[i]; float minBg = sqrEuclidianDist(lab, bgSignature[0]); int minIndex=0; for (unsigned int j=1; j