在正常情况下, OpenCV的python接口和C语言接口基本一致. 但是, 对于python实现比较困难的地方, 一些函数和结构体可能会有不同.
函数接口也尽量保持和C语言一致. 最大的差异是在函数通过参数来返回值的时候. 由于python中有些基本的参数都不可改变的, 因此代替的方法是一次返回多个值. 同样, 大部分的结构和C语言中也有相似的功能, 但是语法可能有些不同.
下面描述比较重要的差异, 具体的细节可以参考python接口的代码.
[编辑]
最大的差异是python接口中没有IplImage! 这主要是为了避免SWIG 在处理IplImage中隐含共享的不足. 以下是具体的替代方法:
原来返回IplImage的函数, 现在返回CvMat 原来读IplImage改为读CvMat CvMat中没有的IplImage属性被添加以支持IplImage, 例如height, width, depth, imageDataSize等. ROI和COI相关函数被禁止使用. 不过用户可以用cvGetSubRect/cvSplit/cvMerge来实现类似的功能.[编辑]
CvMat扩展了python中的2个基本方法__iter__ 和 __getitem__, 来支持元素的简单访问.
通过行的方式迭代
x=cvCreateMat(m, n, type)for row in x:# row is same as that returned by cvGetRow通过列的方式迭代
for col in x.colrange():# col is same as that returned by cvGetCol[编辑]
获取一行
row=x[i]获取一列
col=x[:, i]获取一个区域
slice=x[0:10, 0:10]获取一个元素
elem=x[i, j]# orelem=x[i][j]# or if x is a vectorelem=x[i]同样的方法可以用来修改元素
# x and y are CvMat'sx[0:10, 0:5]=y[10:20, 1:6]x[i, j]=1;x[:, :]=1;x[:, :]=cvScalar(1);x[0:10, i]=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][编辑]
暂时还不支持. 如果您有兴趣自己实现的话, 请联系RomanStanchak.
[编辑]
python中访问CvSeq的代码:
num_contours, contours=cv.cvFindContours(...)# hrange iterates through h_next elementfor contour in contours.hrange():# contour is a CvSeq of pointsfor pt in contour:print pt# alternatelyfor pt in contour.vrange():print pt# alternatelyfor i in range(contour.total):print contour[i][编辑]
python的最大优点是可以在交互命令行中开发程序. 交互shell编程和Matlab类似. 以下在命令行中显示一副图像的代码:
from opencv.cv import *from opencv.highgui import *cvStartWindowThread()cvNamedWindow("win")im=cvLoadImage("pics/airplane.jpg")cvShowImage("win", im)需要注意的是cvStartWindowThread函数, 它目前只支持linux系统. cvStartWindowThread 函数的目的是代替cvWaitKey()来实现窗口的自动刷新. 去掉cvWaitKey()函数之后, 程序的输入将不受cvWaitKey阻塞, 更便于shell交互.
[编辑]
熟悉Matlab或SciPy的朋友, 可以更关注matlab_syntax模块. 该模块采用了和 Matlab/SciPy 类似的方法来创建数组. 很多情况下, 这比用OpenCV的标准函数更加便捷. 切换行号显示
from opencv.cv import *from opencv.highgui import *from opencv.matlab_syntax import *cvStartWindowThread()im=imread("pics/airplane.jpg")imshow(im)该段代码和前面用cvLoadImage显示图像的代码有相同的功能.
注:
文章结构有调整, 细节请参考原文. 作为另一个选择, 大家可以参考NoamLewis中关于CTypes的文档, 不过CTypes只能在Windows系统运行.[编辑]