OpenCV Python库中cv.cornerSubPix的参数

1 投票
2 回答
5486 浏览
提问于 2025-04-16 19:03

我在使用OpenCV的Python接口时,遇到了一个函数执行的问题:

img = cv.LoadImage("calib0.jpg")
grayImg = cv.CreateImage((img.width,img.height), img.depth,1)
cv.CvtColor(img,grayImg,cv.CV_BGR2GRAY)
corners = cv.FindChessboardCorners(grayImg,(5,6), cv.CALIB_CB_ADAPTIVE_THRESH + cv.CALIB_CB_NORMALIZE_IMAGE + cv.CALIB_CB_FAST_CHECK )
cv.cornerSubPix(grayImg,corners,(11,11),(-1,-1),(cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 10, 0.01))

当我在iPython上运行这个代码(在OSX系统上)时,出现了以下错误:


TypeError Traceback (most recent call last) /Users/katherinescott/simplecv-git/SimpleCV/sampleimages/ in () ----> 1 cv.cornerSubPix(grayImg,corners,(11,11),(-1,-1),(cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 10, 0.01))

TypeError: 不是一个numpy数组

我尝试了各种方法把上面的对象转换成numpy的ndarray,但都没有成功。我猜这个错误可能出在终止条件对象上,但我不知道它到底在要求什么。有没有人遇到过这个问题,在使用OpenCV的Python接口进行校准时?我准备开始查看源代码,看看能找到什么。

2 个回答

0

这个问题虽然是老问题,但我觉得大家可能对cv.cornerSubPix()里的winSize参数有些误解。

当你使用

cv.cornerSubPix(grayImg, corners, winSize, (-1,-1), criteria)

假设你想要一个11x11的搜索窗口,那么winSize的正确输入应该是winSize=(5,5),而不是winSize=(11,11)。如果你像原问题那样用(11,11)作为winSize,那么得到的搜索窗口实际上会是23x23。

根据文档的说明:

winSize:搜索窗口边长的一半。例如,如果winSize=Size(5,5),那么使用的搜索窗口大小就是(5∗2+1)×(5∗2+1)=11×11。

截至OpenCV 4.5.2版本(2021年4月),文档中关于cv.findChessboardCorners()的示例似乎是错误的,应该使用(5,5)作为winSize

0

cornerSubPix这个函数,开头是小写字母,是OpenCV这个库在Python中的一个内部函数。

我想你想用的是cv.FindCornerSubPix:

http://opencv.willowgarage.com/documentation/python/imgproc_feature_detection.html#findcornersubpix

撰写回答