使用python的CVType和pycrust调试opencv的代码 提高实验效率

 

# 用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 ] = ty

mmo
= 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 ] = 0
ddm[
2 ] = 350

ddm[
3 ] = 0
ddm[
4 ] = 255
ddm[
5 ] = 250

ddm[
6 ] = 0
ddm[
7 ] = 0
ddm[
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

 


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值