!7 set flag BWIntegralImage_brightnessCheat. set flag BWIntegralImage_useVectorAPI. cmodule2 IILineFinder > DynImageSurfaceAndEnabled { switchable int imageSize = 1000; switchable int warmups = 10; // per round switchable int initialWarmups = 100000; switchable int stripes = 2; // how many threads to use for making integral image ExpectedAndActual> lastError; transient Pair actual, recognized; transient IBWIntegralImage ii; transient ImageSurface isReconstructed; transient S status, errorStatus; transient new Scorer scorer; transient new Average conversionTime, recTime; transient NotTooOften clearRecTime = nto_everyTenSeconds(); transient long rounds; transient autoDispose ThreadPoolExecutor executor = defaultThreadPoolExecutor(); visualize { JComponent c = centerAndSouthWithMargin( jhgrid(jCenteredSection_fontSizePlus(10, "Input", super.visualize()), jCenteredSection_fontSizePlus(10, "Recognition", jscroll_centered(isReconstructed = doubleBufferedImageSurface()))), jvstack(fontSizePlus(10, dm_centeredLabel status()), fontSizePlus(5, dm_centeredLabel errorStatus()))); enableDoubleBuffering(); ret c; } start { thread "Calc" enter { while (true) { if (deleted()) ret; if (!enabled) continue with sleepSeconds(1); pcall { if (clearRecTime!) { recTime.clear(); conversionTime.clear(); } makeImage(); recognize(); score(); reconstruct(); status(); } } } } void makeImage { Pt a = randomPt(imageSize), b = randomPt(imageSize); LineWithColor line = new(a, b, Color.black, 1); BufferedImage img = renderBackgroundPlusLines(imageSize, imageSize, new BackgroundPlus(Color.white, line)); setImage(img); long time = nanoTime(); ii = stripedBWIntegralImage(executor, stripes, img); conversionTime.add(nanoTime()-time); actual = sortedPair(a, b); } void recognize { int w = rounds == 0 ? initialWarmups : warmups; ++rounds; repeat w { bwii_detectSingleLine(ii); } long time = nanoTime(); Pair output = bwii_detectSingleLine(ii); recTime.add(nanoTime()-time); recognized = sortedPair(output); } void score { bool ok = eq(actual, recognized); scorer.add(ok); if (!ok) setField(lastError := ExpectedAndActual(actual, recognized)); } void reconstruct { BufferedImage img = renderBackgroundPlusLines(imageSize, imageSize, new BackgroundPlus(Color.white, LineWithColor(actual.a, actual.b, Color.black, 1))); isReconstructed.setImage(img); } void status { setFields( status := joinNemptiesWithComma( "Image size: " + toMillion(sqr(imageSize), 1) + " MP, conversion time: " + n2_iround(conversionTime!) + " ns", "recognition time: " + n2_iround(recTime!) + " ns", scorer), errorStatus := lastError == null ?: "last error: " + lastError); } }