From c32b3fed92ba413750d96872e878e5431a56b504 Mon Sep 17 00:00:00 2001 From: mmattmcw Date: Sun, 19 Dec 2021 21:12:12 -0500 Subject: [PATCH] Can find corners of frames within scanned page and perform some calculations about height and width. Still need to find rotation info, then rotate and crop to frames for video stitching. --- scan_orientation/scan_orientation.pde | 354 ++++++++++++++++++++++++++ 1 file changed, 354 insertions(+) create mode 100644 scan_orientation/scan_orientation.pde diff --git a/scan_orientation/scan_orientation.pde b/scan_orientation/scan_orientation.pde new file mode 100644 index 0000000..705ca04 --- /dev/null +++ b/scan_orientation/scan_orientation.pde @@ -0,0 +1,354 @@ +String SCANS = "/Users/matthewmcwilliams9/Desktop/running/shot1-scans"; + +int dotSize = 16; +File someFolder; +File[] someFolderList; +ArrayList files = new ArrayList(); +String currentFile; +int filesCount; +int current = -1; +PImage img; +PImage copy; +int left = 0; +int top = 0; +ArrayList points = new ArrayList(); +ArrayList lines = new ArrayList(); + +Frame A; +Frame B; +Frame C; +Frame D; + +class Point { + int x = 0; + int y = 0; + int xPerc; + int yPerc; + int xScaled; + int yScaled; + + Point(int a, int b, int w, int h) { + x = a; + y = b; + xPerc = round(map(x, 0, w, 0, 1000)); + yPerc = round(map(y, 0, h, 0, 1000)); + } + void scale (int xMin, int xMax, int yMin, int yMax) { + xScaled = round(map(xPerc, xMin, xMax, 0, 100)); + yScaled = round(map(yPerc, yMin, yMax, 0, 100)); + } +} + +class Line { + int x1; + int y1; + int x2; + int y2; + Line (int a, int b, int c, int d) { + x1 = a; + y1 = b; + x2 = c; + y2 = d; + } + void draw () { + line(x1 + left, y1 + top, x2 + left, y2 + top); + } +} + +class Frame { + PImage im; + String which; + + Point leftTop; + Point rightTop; + Point leftBottom; + Point rightBottom; + + int W; + int H; + + Frame (String w, PImage a) { + im = a; + which = w; + } + + public void try_all (ArrayList pointsEval) { + Point p; + int xMin = 1000000; + int xMax = 0; + int yMin = 1000000; + int yMax = 0; + + float closest = im.width * im.height; + float dists[] = new float[pointsEval.size()]; + + int corner = -1; + Point cornerP; + + int cornerShort = -1; + Point cornerShortP; + + int cornerLong = -1; + Point cornerLongP; + + int cornerDiag = -1; + Point cornerDiagP; + + for (int i = 0; i < pointsEval.size(); i++) { + p = pointsEval.get(i); + if (p.xPerc > xMax) { + xMax = p.xPerc; + } + if (p.xPerc < xMin) { + xMin = p.xPerc; + } + if (p.yPerc > yMax) { + yMax = p.yPerc; + } + if (p.yPerc < yMin) { + yMin = p.yPerc; + } + } + + for (int i = 0; i < pointsEval.size(); i++) { + p = pointsEval.get(i); + p.scale(xMin, xMax, yMin, yMax); + + if (which.equals("A")) { + //bottom left + if (p.xScaled < 2 && p.xScaled > -1 && p.yScaled > 98 && p.yScaled < 101) { + corner = i; + } + } else if (which.equals("B")) { + //top left + if (p.xScaled < 2 && p.xScaled > -1 && p.yScaled > -1 && p.yScaled < 2) { + corner = i; + } + } else if (which.equals("C")) { + //top right + if (p.xScaled < 101 && p.xScaled > 98 && p.yScaled > -1 && p.yScaled < 2) { + corner = i; + } + } else if (which.equals("D")) { + //bottom right + if (p.xScaled < 101 && p.xScaled > 98 && p.yScaled > 98 && p.yScaled < 101) { + corner = i; + } + } + } + + if (corner == -1) { + println("Could not find corner"); + exit(); + } + + cornerP = pointsEval.get(corner); + + for (int i = 0; i < pointsEval.size(); i++) { + p = pointsEval.get(i); + if (i == corner) { + dists[i] = im.width * im.height; + } else { + dists[i] = dist(cornerP.x, cornerP.y, p.x, p.y); + } + } + + for (int i = 0; i < pointsEval.size(); i++) { + p = pointsEval.get(i); + if (i != corner + && abs(cornerP.xScaled - p.xScaled) > 10 + && dists[i] < closest) { + closest = dists[i]; + cornerShort = i; + } + } + + closest = im.width * im.height; + + for (int i = 0; i < pointsEval.size(); i++) { + p = pointsEval.get(i); + if (i != corner + && i != cornerShort + && abs(cornerP.xScaled - p.xScaled) < 10 + && dists[i] < closest) { + closest = dists[i]; + cornerLong = i; + } + } + + closest = im.width * im.height; + + for (int i = 0; i < pointsEval.size(); i++) { + p = pointsEval.get(i); + if (i != corner + && i != cornerShort + && i != cornerLong + && abs(cornerP.xScaled - p.xScaled) > 10 + && abs(cornerP.yScaled - p.yScaled) > 10 + && dists[i] < closest) { + closest = dists[i]; + cornerDiag = i; + } + } + + cornerShortP = pointsEval.get(cornerShort); + cornerLongP = pointsEval.get(cornerLong); + cornerDiagP = pointsEval.get(cornerDiag); + + lines.add(new Line(cornerP.x, cornerP.y, cornerShortP.x, cornerShortP.y)); + lines.add(new Line(cornerP.x, cornerP.y, cornerLongP.x, cornerLongP.y)); + lines.add(new Line(cornerDiagP.x, cornerDiagP.y, cornerShortP.x, cornerShortP.y)); + lines.add(new Line(cornerDiagP.x, cornerDiagP.y, cornerLongP.x, cornerLongP.y)); + + println(which); + print(cornerP.xScaled); + print(","); + println(cornerP.yScaled); + + print(cornerShortP.xScaled); + print(","); + println(cornerShortP.yScaled); + + print(cornerLongP.xScaled); + print(","); + println(cornerDiagP.yScaled); + + print(cornerDiagP.xScaled); + print(","); + println(cornerDiagP.yScaled); + + W = round( ( abs(cornerP.y - cornerLongP.y) + abs(cornerShortP.y - cornerDiagP.y) ) / 2); + H = round( ( abs(cornerP.x - cornerShortP.x) + abs(cornerLongP.x - cornerDiagP.x) ) / 2); + print(W); + print("x"); + println(H); + + delay(5000); + } +} + +void listFiles () { + someFolder = new File(SCANS); + someFolderList = someFolder.listFiles(); + for (File someFile : someFolderList) { + if (someFile.isFile()) { + if (someFile.getName().endsWith(".png")) { + files.add(someFile.getPath()); + } + } + } +} + +void updateFile () { + current++; + if (current == filesCount) { + println("files completed"); + exit(); + } else { + left = 0; + top = 0; + currentFile = files.get(current); + print("using "); + println(currentFile); + img = loadImage(currentFile); + copy = createImage(img.width, img.height, RGB); + copy.copy(img, 0, 0, img.width, img.height, 0, 0, img.width, img.height); + copy.resize(0, height); + println("loaded"); + println(img.width); + println(img.height); + } +} + +void processFile () { + clear(); + image(copy, 0, 0); + delay(2000); + A = new Frame("A", img); + B = new Frame("B", img); + C = new Frame("C", img); + D = new Frame("D", img); + A.try_all(points); + B.try_all(points); + C.try_all(points); + D.try_all(points); +} + +void keyPressed () { + int step = 100; + if (key == 'w') { + if (top < 0) { + top += step; + } + } else if (key == 's') { + if (abs(top) < img.height - height) { + top -= step; + } + } else if (key == 'a') { + if (left < 0) { + left += step; + } + } else if (key == 'd') { + if (abs(left) < img.width - width) { + left -= step; + } + } else if (key == 'x') { + if (points.size() > 0) { + points.remove(points.size() - 1); + } + } else if (keyCode == ENTER) { + if (points.size() == 16) { + points = new ArrayList(); + lines = new ArrayList(); + updateFile(); + } + } +} + +void mousePressed () { + int x = mouseX - left; + int y = mouseY - top; + print("added "); + print(x); + print(","); + println(y); + points.add(new Point(x, y, img.width, img.height)); + if (points.size() == 16) { + println("file marked"); + processFile(); + } +} + +void setup () { + size(800, 600); + listFiles(); + if (files.size() > 0) { + filesCount = files.size(); + updateFile(); + } else { + println("No files"); + exit(); + } +} + +void draw () { + Point p; + Line l; + fill(255,100,100); + noStroke(); + + image(img, left, top); + ellipse(mouseX, mouseY, dotSize, dotSize); + + fill(255,0,0); + for (int i = 0; i < points.size(); i++) { + p = points.get(i); + ellipse(p.x + left, p.y + top, dotSize, dotSize); + } + strokeWeight(2); + stroke(255, 0, 0); + for (int i = 0; i < lines.size(); i++) { + l = lines.get(i); + l.draw(); + } +}