OpenCVとPythonと私 vol.6
#!/usr/bin/python
import cv, numpy
from opencv import highgui
import sys
import getopt
filename = None
debug = False
rows = 0
columns = 0
span = 0
sourceFile = None
destinationFile = 'result.png'
def main () :
global filename
global debug
global rows
global columns
global span
global sourceFile
global destinationFile
try:
opts, args = getopt.getopt( sys.argv[1:], "hdr:c:s:u:o:",["help","debug","rows","columns","span","undistort","output"])
except getopt.GetoptError, err :
print str( err )
usage()
sys.exit(2)
if len( args ) != 0 :
filename = args[:]
else :
usage()
sys.exit(0)
for o, a in opts :
if o in ( "-h", "--help" ) :
usage()
sys.exit(0)
elif o in ( "-d", "--debug" ) :
debug = True
elif o in ( "-r", "--rows" ) :
rows = int( a )
elif o in ( "-c", "--columns" ) :
columns = int( a )
elif o in ( "-s", "--span" ) :
span = int( a )
elif o in ( "-u", "--undistort" ) :
sourceFile = a
elif o in ( "-o", "--output" ) :
destinationFile = a
else :
assert False, "unhandled option"
def debugout ( str ) :
if debug == True :
print str
def usage () :
print "Usage: undistortTest.py [OPTION] FILE"
print " "
print " -h, --help Display this message."
print " -d, --debug Output debug log."
print " -r, --rows Row counts of chessboard's corners"
print " -c, --columns Column counts of chessboard's corners"
print " -s, --span Length of between 2 corners"
print " -u, --undistort Specify distorted image."
print " -o, --output Set undistorted output file name."
if __name__ == "__main__" :
main()
objectPointsList =
imagePointsList =
for element in filename :
'''
debugout( "Input file name is " + element )
'''
img = cv.LoadImage( element , cv.CV_LOAD_IMAGE_GRAYSCALE )
corners = cv.FindChessboardCorners( img, ( columns, rows ) )
for corner in corners[1] :
imagePointsList.append( list( corner ) )
ytmp = range( columns )
ytmp.reverse()
for x in range( rows ) :
for y in ytmp :
objectPoint = []
objectPoint.append( x * span )
objectPoint.append( y * span )
objectPoint.append( 0 )
objectPointsList.append( objectPoint )
del objectPoint
imagePointsArray = numpy.array( imagePointsList, 'float' )
imagePoints = cv.fromarray( imagePointsArray )
objectPointsArray = numpy.array( objectPointsList, 'float' )
objectPoints = cv.fromarray( objectPointsArray )
cameraMatrix = cv.CreateMat( 3, 3, cv.CV_32FC1 )
distortionCoeffs = cv.CreateMat( 1, 4, cv.CV_32FC1 )
rotationVector = cv.CreateMat( len( filename ), 3, cv.CV_32FC1 )
translationVector = cv.CreateMat( len( filename ), 3, cv.CV_32FC1 )
pointCountsArray = rows * columns * numpy.ones( ( len( filename ), 1 ) ,'int32')
pointCounts = cv.fromarray( pointCountsArray )
try:
cv.CalibrateCamera2( objectPoints, imagePoints, \
pointCounts ,\
( img.height, img.width ) ,\
cameraMatrix, distortionCoeffs,\
rotationVector, translationVector, 0 )
except cv.error, err :
print str( err )
sys.exit(2)
distortedImage = cv.LoadImageM( sourceFile )
undistortedImage = cv.LoadImageM( sourceFile )
cv.Undistort2( distortedImage, undistortedImage, cameraMatrix, distortionCoeffs )
cv.NamedWindow( "Before", cv.CV_WINDOW_AUTOSIZE )
cv.NamedWindow( "After", cv.CV_WINDOW_AUTOSIZE )
cv.MoveWindow( "Before", 100, 100)
cv.MoveWindow( "After", 100, 200 )
cv.ShowImage( "Before", distortedImage )
cv.ShowImage( "After", undistortedImage )
cv.SaveImage( destinationFile, undistortedImage )
print "Hit any key."
cv.WaitKey( 0 )
cv.DestroyWindow( "Before" )
cv.DestroyWindow( "After" )