简介: 在一个项目中我希望封装一些opencv的函数,方便自己使用,类里面没有定义成员变量,所以我以为在成员函数里面没必要加self了,然后一直显示参数数目错,这里把工程抽象一下,把问题点提取出来记录一下。
- 代码
import cv2 as cv
import numpy as np
class cvtool:
def showImage(self,img, name="img", waitkeyMode=1, destroyMode=0, windowSizeMode=0):
if img is None:
print("In function showImage: the input image is None!")
return
cv.namedWindow(name,windowSizeMode)
cv.imshow(name,img)
cv.waitKey(waitkeyMode)
if windowSizeMode != 0:
cv.destroyWindow(name)
def canny(img, th1=80, th2=180):
return cv.Canny(img,th1,th2)
mytool = cvtool()
img = cv.imread("F:\\imagedata\\miniLed\\templateMatch\\src_1.png")
canny = mytool.canny(img, 80, 180)
mytool.showImage(canny,"canny",0)
- 报错
Traceback (most recent call last):
File "del.py", line 21, in <module>
canny = mytool.canny(img, 80, 180)
TypeError: canny() takes from 1 to 3 positional arguments but 4 were given
- 问题
python类的成员函数必须有一个参数表示对象本身,而且必须是参数列表的第一个,在调用成员函数时,第一个参数是不会被赋值的,传递进来的参数都是从第二个开始赋值。
例如:
class test:
def aaaa(first, second=2, third=3):
print("first:{},second:{},third:{}".format(first,second,third))
t = test()
t.aaaa(1,2)
输出:
(py3) D:\mydoc\python\imageProcess>python del2.py
first:<__main__.test object at 0x00000221EA0A4670>,second:1,third:2
从结果可以看出调用aaaa(1,2)方法时,1没有传给first,而是传给second,first表示的是对象,这是python自动完成的。一般情况下我们都用self表示对象本身,如:def aaa(self,first,second):但是self并不是python的关键字,也就是self可以换成其他任何你想换的名字(除了python关键字),不过为了直观大多数都选择用self了。
4.要修改1.中的bug就很容易了,在类成员函数的参数列表里加上self即可。
def canny(self, img, th1=80, th2=180):
return cv.Canny(img,th1,th2)
网友评论