mirror of https://github.com/opencv/opencv.git
parent
850f215305
commit
e7f0ad3c18
3 changed files with 3793 additions and 0 deletions
@ -0,0 +1,4 @@ |
|||||||
|
use |
||||||
|
python gen_pattern.py --help |
||||||
|
|
||||||
|
to generate various calibration svg calibration patterns. |
@ -0,0 +1,121 @@ |
|||||||
|
"""gen_pattern.py |
||||||
|
To run: |
||||||
|
-c 10 -r 12 -o out.svg |
||||||
|
-T type of pattern, circles, acircles, checkerboard |
||||||
|
-s --square_size size of squares in pattern |
||||||
|
-u --units mm, inches, px, m |
||||||
|
-w page width in units |
||||||
|
-h page height in units |
||||||
|
""" |
||||||
|
|
||||||
|
from svgfig import * |
||||||
|
|
||||||
|
import sys |
||||||
|
import getopt |
||||||
|
|
||||||
|
class PatternMaker: |
||||||
|
def __init__(self, cols,rows,output,units,square_size,page_width,page_height): |
||||||
|
self.cols = cols |
||||||
|
self.rows = rows |
||||||
|
self.output = output |
||||||
|
self.units = units |
||||||
|
self.square_size = square_size |
||||||
|
self.width = page_width |
||||||
|
self.height = page_height |
||||||
|
self.g = SVG("g") # the svg group container |
||||||
|
def makeCirclesPattern(self): |
||||||
|
spacing = self.square_size |
||||||
|
r = spacing / 5.0 #radius is a 5th of the spacing TODO parameterize |
||||||
|
for x in range(1,self.cols+1): |
||||||
|
for y in range(1,self.rows+1): |
||||||
|
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black") |
||||||
|
self.g.append(dot) |
||||||
|
|
||||||
|
def makeACirclesPattern(self): |
||||||
|
spacing = self.square_size |
||||||
|
r = spacing / 5.0 |
||||||
|
row_shift = 0 |
||||||
|
for y in range(1,self.rows+1): |
||||||
|
for x in range(1,self.cols+1): |
||||||
|
dot = SVG("circle", cx= (x + row_shift/2.0) * spacing, cy=y * spacing, r=r, fill="black") |
||||||
|
self.g.append(dot) |
||||||
|
#this makes the pattern asymetric |
||||||
|
if row_shift is 0: |
||||||
|
row_shift = 1 |
||||||
|
else: |
||||||
|
row_shift = 0 |
||||||
|
def makeCheckerboardPattern(self): |
||||||
|
spacing = self.square_size |
||||||
|
r = spacing / 5.0 |
||||||
|
for x in range(1,self.cols+1): |
||||||
|
for y in range(1,self.rows+1): |
||||||
|
#TODO make a checkerboard pattern |
||||||
|
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black") |
||||||
|
self.g.append(dot) |
||||||
|
def save(self): |
||||||
|
c = canvas(self.g,width="%d%s"%(self.width,self.units),height="%d%s"%(self.height,self.units),viewBox="0 0 %d %d"%(self.width,self.height)) |
||||||
|
c.inkview(self.output) |
||||||
|
|
||||||
|
def makePattern(cols,rows,output,p_type,units,square_size,page_width,page_height): |
||||||
|
width = page_width |
||||||
|
spacing = square_size |
||||||
|
height = page_height |
||||||
|
r = spacing / 5.0 |
||||||
|
g = SVG("g") # the svg group container |
||||||
|
for x in range(1,cols+1): |
||||||
|
for y in range(1,rows+1): |
||||||
|
if "circle" in p_type: |
||||||
|
dot = SVG("circle", cx=x * spacing, cy=y * spacing, r=r, fill="black") |
||||||
|
g.append(dot) |
||||||
|
c = canvas(g,width="%d%s"%(width,units),height="%d%s"%(height,units),viewBox="0 0 %d %d"%(width,height)) |
||||||
|
c.inkview(output) |
||||||
|
|
||||||
|
|
||||||
|
def main(): |
||||||
|
# parse command line options, TODO use argparse for better doc |
||||||
|
try: |
||||||
|
opts, args = getopt.getopt(sys.argv[1:], "ho:c:r:T:u:s:w:h:", ["help","output","columns","rows", |
||||||
|
"type","units","square_size","page_width", |
||||||
|
"page_height"]) |
||||||
|
except getopt.error, msg: |
||||||
|
print msg |
||||||
|
print "for help use --help" |
||||||
|
sys.exit(2) |
||||||
|
output = "out.svg" |
||||||
|
columns = 8 |
||||||
|
rows = 11 |
||||||
|
p_type = "circles" |
||||||
|
units = "mm" |
||||||
|
square_size = 20.0 |
||||||
|
page_width = 216 #8.5 inches |
||||||
|
page_height = 279 #11 inches |
||||||
|
# process options |
||||||
|
for o, a in opts: |
||||||
|
if o in ("-h", "--help"): |
||||||
|
print __doc__ |
||||||
|
sys.exit(0) |
||||||
|
elif o in ("-r", "--rows"): |
||||||
|
rows = int(a) |
||||||
|
elif o in ("-c", "--columns"): |
||||||
|
columns = int(a) |
||||||
|
elif o in ("-o", "--output"): |
||||||
|
output = a |
||||||
|
elif o in ("-T", "--type"): |
||||||
|
p_type = a |
||||||
|
elif o in ("-u", "--units"): |
||||||
|
units = a |
||||||
|
elif o in ("-s", "--square_size"): |
||||||
|
square_size = float(a) |
||||||
|
elif o in ("-w", "--page_width"): |
||||||
|
page_width = float(a) |
||||||
|
elif o in ("-h", "--page_height"): |
||||||
|
page_height = float(a) |
||||||
|
pm = PatternMaker(columns,rows,output,units,square_size,page_width,page_height) |
||||||
|
#dict for easy lookup of pattern type |
||||||
|
mp = {"circles":pm.makeCirclesPattern,"acircles":pm.makeACirclesPattern,"checkerboard":pm.makeCheckerboardPattern} |
||||||
|
mp[p_type]() |
||||||
|
#this should save pattern to output |
||||||
|
pm.save() |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
main() |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue