# 用CVType (http://wwwx.cs.unc.edu/~gb/wp/blog/2007/06/26/cvtypes-updated-2/)的python接口 # 在pycrust调试,效率很高,需要安装python2.5, wxpython # 将 opencv 的三个dll拷贝到python的dlls目录 # 将CVType的py等文件拷贝到python的libs目录 # 运行python下的scripes目录里的pycrust.bat # 最后按照如下语法调试,下面是一个标定程序 # pycrust的自动补齐热键很好,在help里有介绍,类似matlab command windows from CVtypes import * from ctypes import * sz = cv.Size( 12 , 8 )i = c_int()j = c_int()mm = cv.CreateMat( 96 * 20 , 2 ,CV_32FC1)[0]dmm = ctypes.cast(mm.data,POINTER(c_float))co = cv.Point2D32f * 100 co = co() # for j in range( 20 ): im = cv.LoadImage( " d://calibration// " + str(j + 1 ) + " .bmp " ,0) print j i = c_int() cv.FindChessboardCorners(im,sz,co,pointer(i),0) cr = cv.TermCriteria( 2 , 100 ,. 001 ) szz = cv.Size( 1 , 1 ) szw = cv.Size( 5 , 5 ) cv.FindCornerSubPix(im,co,i,szw,szz,cr) for i in range( 96 ): dmm[i * 2 + j * 96 * 2 ] = co[i].x dmm[i * 2 + 1 + j * 96 * 2 ] = co[i].y cv.ReleaseImage(im) for i in range( 96 / 2 ): tx = dmm[i * 2 + 15 * 96 * 2 ] dmm[i * 2 + 15 * 96 * 2 ] = dmm[( 95 - i) * 2 + 15 * 96 * 2 ] dmm[( 95 - i) * 2 + 15 * 96 * 2 ] = tx ty = dmm[i * 2 + 1 + 15 * 96 * 2 ] dmm[i * 2 + 1 + 15 * 96 * 2 ] = dmm[( 95 - i) * 2 + 1 + 15 * 96 * 2 ] dmm[( 95 - i) * 2 + 1 + 15 * 96 * 2 ] = tymmo = cv.CreateMat( 96 * 20 , 3 ,CV_32FC1)[0]ddm = ctypes.cast(mmo.data,POINTER(c_float)) for j in range( 20 ): for i in range ( 96 ): ddm[i * 3 + j * 96 * 3 ] = (i - int(i / 12 ) * 12 ) * 383 . / 1300 . * 100 . ddm[i * 3 + 1 + j * 96 * 3 ] = int(i / 12 ) * 259 . / 884 . * 100 . ddm[i * 3 + 2 + j * 96 * 3 ] = 0 mmpc = cv.CreateMat( 20 , 1 ,CV_32SC1)[0]ddm = ctypes.cast(mmpc.data,POINTER(c_int)) for i in range( 20 ): ddm[i] = 96 sz = cv.Size( 700 , 500 )mmin = cv.CreateMat( 3 , 3 ,CV_32FC1)[0]ddm = ctypes.cast(mmin.data,POINTER(c_float))ddm[0] = 255 ddm[ 1 ] = 0ddm[ 2 ] = 350 ddm[ 3 ] = 0ddm[ 4 ] = 255 ddm[ 5 ] = 250 ddm[ 6 ] = 0ddm[ 7 ] = 0ddm[ 8 ] = 1 mmdi = cv.CreateMat( 4 , 1 ,CV_32FC1)[0]ddm = ctypes.cast(mmdi.data,POINTER(c_float))ddm[0] =- . 1 ddm[ 1 ] =- . 1 ddm[ 2 ] = . 02 ddm[ 3 ] = . 02 mmro = cv.CreateMat( 20 , 3 ,CV_32FC1)[0]mmtr = cv.CreateMat( 20 , 3 ,CV_32FC1)[0]cv.CalibrateCamera2(pointer(mmo),pointer(mm),pointer(mmpc),sz,pointer(mmin),pointer(mmdi),pointer(mmro),pointer(mmtr),0)ww = " show " sz = cv.Size( 12 , 8 )cv.NamedWindow(ww) for j in range( 20 ): im = cv.LoadImage( " d://calibration// " + str(j + 1 ) + " .bmp " ) cv.DrawChessboardCorners(im,sz,ctypes.cast(mm.data + 96 * j * 2 * 4 ,POINTER(CvPoint2D32f)), 96 , 1 ) cv.ShowImage(ww,im) j cv.WaitKey(0) cv.ReleaseImage(im) cv.NamedWindow( " show " )cv.ShowImage( " show " ,im)im = cv.LoadImage( " d://calibration// " + str( 19 ) + " .bmp " ,0)im2 = cv.LoadImage( " d://calibration// " + str( 19 ) + " .bmp " ,0)cv.ShowImage( " show " ,im)cv.Undistort2(im,im2,pointer(mmin),pointer(mmdi))cv.ShowImage( " show " ,im)cv.NamedWindow( " show " )cv.DrawChessboardCorners(im,sz,co,i, 1 )cv.ShowImage( " show " ,im) # 为了更好的访问CvMat可以修改CVType.py文件的CvMat定义如下 # Multi-dimensional dense multi-channel matrix class CvMatNDdata(Union): _fields_ = [( " ptr " , POINTER(c_ubyte)), ( " s " , POINTER(c_short)), ( " i " , POINTER(c_int)), ( " fl " , POINTER(c_float)), ( " db " , POINTER(c_double))] # Multi-channel matrix class CvMat(Structure): _fields_ = [( " type " , c_int), ( " step " , c_int), ( " refcount " , c_void_p), ( " hdr_refcount " , c_int), # hy test ("data", c_void_p), ( " data " , CvMatNDdata), ( " rows " , c_int), ( " cols " , c_int)] # 注意调整二者的位置,之后就可以这样访问 mmro = cv.CreateMat( 20 , 3 ,CV_32FC1)[0]mmro.data.db[ 10 ] = 12312