网上对于Python调用OpenCV库的例程和资料都比较少。Python中调用OpenCV可以使用CV2,也可以使用CV。两者的不同在于,CV2的数据结构全部为numpy结构。所以一般如下:
import cv2
import numpy as np
……
使用CV2的好处在于,numpy的数据结构容易处理,编程风格与matlab非常相近。
与CV2相比,CV库就大相径庭了,其数据结构、函数组织形式基本与C++版的OpenCV相差无几:
import cv2.cv as cv
import numpy as np
……
在使用CV库时最好也导入numpy库,因为有的地方还是可以用到的。
由于个人觉得CV与商业应用的调用格式比较相近,学好CV库对将来从事OpenCV的正规工作会有一定帮助,所以我选择了CV库的学习。可能是因为一时兴起的原因,我并没有系统地学习OpenCV的基础知识,其实,如果要学好OpenCV最好是借一本专业的书籍,从基本的数据结构、命名规则学起。当然,如果能弄懂里面那些函数的算法原理就更好了。这方面一般OpenCV的学习书籍是不会讲的。不过网上可以找到一些chm格式的帮助文档(有中文的),我发现里面有很多函数的原理会做简短的说明,这部分对于想完全弄懂图像处理原理的人很有用。需要这方面资料的可以百度“opencv参考手册.chm”。
图像读入:img =
cv.LoadImage('ImageName')
变换彩色空间:cv.CvtColor(src, dst,
cv.CV_BGR2YCrCb) #这里也可以把图像转换为灰度图。
变换图像时,要注意dst要事先分配内存:
cv.CreateImage(cv.GetSize(img), cv.IPL_DEPTH_8U, 3)
将彩色图像的各个通道分开:
cv.Split(img,
ch1, ch2, ch3, None)
有时我们会用到矩阵:
matrix = cv.CreateMat(rows,
cols, cv.CV_32FC1)
上面语句中,CV_32FC1代表32位浮点型单通道。‘C'代表通道,’F'代表浮点型。通过这个语句就创建了一个rows行,cols列的矩阵,并且分配了空间。
如果要对矩阵进行赋值可以用如下 :
data
=[[1,1,1],[1,2,1],[1,-10,1],[1,2,1]]#data 为一个3x3的二维列表
for i in range(3):
for j in
range(3):
matrix[i,j] = data[i][j]
对于矩阵里的数据,普通方法是没法查看的,可以利用np库:
print np.asarray(matrix)
#这里就是我为什么在CV库中也导入numpy库的原因了。如果有时对数据不明白,想打印出来时,利用np这个函数就比较方便了。
(待续……)