python连接opencv库_OpenCV 的Python接口

Wikipedia,自由的百科全书

[编辑]

python接口的差异

在正常情况下, OpenCV的python接口和C语言接口基本一致. 但是, 对于python实现

比较困难的地方, 一些函数和结构体可能会有不同.

函数接口也尽量保持和C语言一致. 最大的差异是在函数通过参数来返回值的时候.

由于python中有些基本的参数都不可改变的, 因此代替的方法是一次返回多个值.

同样, 大部分的结构和C语言中也有相似的功能, 但是语法可能有些不同.

下面描述比较重要的差异, 具体的细节可以参考python接口的代码.

[编辑]

没有IplImage

最大的差异是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]

# or

elem = x[i][j]

# or if x is a vector

elem = x[i]

同样的方法可以用来修改元素

# x and y are CvMat's

x[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]

[编辑]

CvMatND

暂时还不支持. 如果您有兴趣自己实现的话, 请联系RomanStanchak.

[编辑]

CvSeq

python中访问CvSeq的代码:

num_contours, contours = cv.cvFindContours(...)

# hrange iterates through h_next element

for contour in contours.hrange():

# contour is a CvSeq of points

for pt in contour:

print pt

# alternately

for pt in contour.vrange():

print pt

# alternately

for 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语法

熟悉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系统运行.

[编辑]

翻译者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值