Ground control point targets are useful to stitch photos on uniform or repeatitive landscapes. They can be made from cardbord plates, cloth etc. See for example this note.
However, on very uniform areas, even ground control points may not help: photos of green patches of grass with identical control points are hard to tell apart. In such situations, a coded ground control point marker comes in handy.
A simple approach I thought up over coffee with Thomas Groen is to make a paper sheet with a 3x3 grid of black-or-white squares, forming a binary code of 9 positions. The codes in the photo above for example are numbers 000.000.001 and 000.000.101 (when white = 1, black = 0).
Paper sheets with codes can be generated easily with some easy code, such as this script for Processing:
#7E7E7E;">// Coded ground control points // #CC6600;">import processing.pdf.*; #CC6600;">size (297, 420,PDF, #006699;">"GCPs.pdf"); #7E7E7E;">// setup for A3 standard sheets #7E7E7E;">// load font' #CC6600;">PFont font; font = #CC6600;">loadFont(#006699;">"Georgia-12.vlw"); #CC6600;">int achtergrond = 200; #7E7E7E;">// sets background #CC6600;">for (#CC6600;">int teller = 0; teller <= 98; teller = teller +1) { #CC6600;">background(achtergrond); #CC6600;">String #CC6600;">str = #CC6600;">binary(teller, 9); #CC6600;">println(#CC6600;">str); #CC6600;">for (#CC6600;">int i = 0; i < 3; i = i+1) { #CC6600;">for (#CC6600;">int j = 0; j < 3; j = j+1) { #CC6600;">stroke(achtergrond); #CC6600;">fill(achtergrond*(#CC6600;">int(#CC6600;">str.#CC6600;">charAt(j+i*3))-48)); #CC6600;">rect(4+96*j, 4+96*i, 95, 95); } } #7E7E7E;">// draw scalebar of 250 mm long #CC6600;">fill(1, 1, 1); #CC6600;">stroke(1); #CC6600;">rect(23, 308, 250, 94); #7E7E7E;">// draw cross for GPS capture" #CC6600;">stroke (achtergrond); #CC6600;">strokeWeight(2); #CC6600;">line(149-20,354,149+20,354); #CC6600;">line (149, 354-20,149, 354+20); #7E7E7E;">// add text #CC6600;">fill(100); #CC6600;">textFont(font, 6); #CC6600;">text(#006699;">"jasjavliegt.nl ", 40,330); #CC6600;">text(#006699;">"Nr. "+teller, 40,350); PGraphicsPDF pdf = (PGraphicsPDF) g; #7E7E7E;">// Get the renderer pdf.nextPage(); #7E7E7E;">// Tell it to go to the next page } #CC6600;">exit();
7 Comments
Interesting. Is it possible to include a north arrow scale?
Is this a question? Click here to post it to the Questions page.
Reply to this comment...
Log in to comment
Thank you Juan, yes, that would be possible, but it would be easiest to use the rectangle, the scale bar, as a north arrow. If you always point it north-south, with the code on the left (or right) consistently, it should work like that. I could upload a pdf of say the first 30 codes in A3 format if anyone is interested.
Reply to this comment...
Log in to comment
Yes, but for technical photography (archeology, for example) I think it's better explain the North.
And yes, I am interested.
Reply to this comment...
Log in to comment
Great idea with the coded ground control points-- I attached the rendered PDFs for folks who aren't comfortable with code, and made a modified version for USAians in our standard 11"x17" paper size (279mmx432mm).
One note, in the code it said the scale blocks were 200mm, but they're actually 250.
11x17 processing code:
// Coded ground control points // import processing.pdf.*; size (279, 432,PDF, "GCPs.pdf"); // setup for 11x17 standard sheets // load font' PFont font; font = loadFont("Georgia-12.vlw"); int achtergrond = 200; // sets background for (int teller = 0; teller <= 98; teller = teller +1) { background(achtergrond); String str = binary(teller, 9); println(str); for (int i = 0; i < 3; i = i+1) { for (int j = 0; j < 3; j = j+1) { stroke(achtergrond); fill(achtergrond*(int(str.charAt(j+i*3))-48)); rect(6+89*j, 6+89*i, 88, 88); //modified for 11x17 } } // draw scalebar of 250 mm long fill(1, 1, 1); stroke(1); rect(14, 308, 250, 94); // draw cross for GPS capture" stroke (achtergrond); strokeWeight(2); line(139-20,354,139+20,354);//modified for 11x17 line (139, 354-20,139, 354+20); //modified for 11x17 // add text fill(100); textFont(font, 6); text("jasjavliegt.nl ", 40,330); text("Nr. "+teller, 40,350); PGraphicsPDF pdf = (PGraphicsPDF) g; // Get the renderer pdf.nextPage(); // Tell it to go to the next page } exit();Reply to this comment...
Log in to comment
Matthew, that is great, thanks. I did not know how to attach documents to the post yet.
I've changed the 200 mm error in the script comments.
Also note that you can replace my commercial message on the GCP's with anything you want by altering the line
text("jasjavliegt.nl ", 40,330);
The text between " " is the text that is printed.
Reply to this comment...
Log in to comment
I'm interested in printing some of these nice panels, but don't know how to use this code. Is the PDF posted somewhere?
Is this a question? Click here to post it to the Questions page.
Reply to this comment...
Log in to comment
hmmm... the attachments are missing from this post. they are still on the old site. I'll file an issue. until then: http://publiclaboratory.org/notes/jasja/6-13-2012/coded-ground-control-points
Reply to this comment...
Log in to comment
Login to comment.