cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
时间: 2023-10-02 10:11:20 浏览: 64
这是 OpenCV 中用于亚像素级别角点检测的函数,具体解释如下:
cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
- gray:输入图像,必须为单通道 8 位或浮点型图像。
- corners:输入角点位置,通常是使用 cv2.goodFeaturesToTrack() 函数检测得到的角点。
- (11, 11):角点搜索窗口大小,必须为奇数。
- (-1, -1):表示不使用角点初始猜测位置,也可以设置为角点的初始猜测位置。
- criteria:角点搜索终止条件,包括最大迭代次数和搜索精度等参数。
该函数的作用是对角点进行亚像素级别的精确定位,提高角点检测的精度和稳定性。
相关问题
cv2.cornerSubPix
cv2.cornerSubPix是OpenCV中用于亚像素级别角点检测的函数。它可以对角点进行精细化处理,提高角点检测的准确性。
该函数的语法如下:
```
cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria)
```
其中,参数含义如下:
- image:输入图像,必须是单通道8位或浮点型图像。
- corners:输入的角点向量,可以是由cv2.goodFeaturesToTrack()等函数检测出来的角点。
- winSize:搜索窗口大小。
- zeroZone:死区大小,表示在搜索过程中不计算的中心区域大小。
- criteria:迭代终止条件。
下面是一个示例代码:
```python
import cv2
import numpy as np
img = cv2.imread('corner.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
corners = np.int0(corners)
for i in corners:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
cv2.imshow('corners', img)
cv2.waitKey(0)
corners_subpix = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
for i in corners_subpix:
x, y = i.ravel()
cv2.circle(img, (x, y), 3, (0, 255, 0), -1)
cv2.imshow('corners_subpix', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
images= glob.glob('./image/*.jpg') # print(images) for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Find the chess board corners # If desired number of corners are found in the image then ret = true ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE) """ If desired number of corner are detected, we refine the pixel coordinates and display them on the images of checker board """ if ret == True: objpoints.append(objp) # refining pixel coordinates for given 2d points. corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) imgpoints.append(corners2) # Draw and display the corners img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret) # cv2.imshow('img',img) # cv2.waitKey(0) cv2.destroyAllWindows() # h, w = np.array(img).shape[:2] h, w = img.shape[:2] """ Performing camera calibration by passing the value of known 3D points (objpoints) and corresponding pixel coordinates of the detected corners (imgpoints) """ ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) print("Camera matrix : \n") print(mtx) print("dist : \n") print(dist) print("rvecs : \n") print(rvecs) print("tvecs : \n") print(tvecs)这段代码有错误,请帮我找出来
这段代码存在一些错误,可能会导致出现你之前提到的错误。我列出了一些可能的问题:
1. 代码中没有定义CHECKERBOARD变量,需要在代码中加入如下语句定义CHECKERBOARD:
CHECKERBOARD = (6, 9)
2. 代码中没有定义objp变量,需要在代码中加入如下语句定义objp:
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
3. 可能存在一些图像无法找到所有的角点,导致ret为False。可以在代码中加入如下语句,跳过这些无法找到所有角点的图像:
if ret == False:
continue
4. 在调用calibrateCamera函数时,输入的第三个参数应该是图像的大小,而不是灰度图像的大小。可以将代码中的gray.shape[::-1]修改为img.shape[:2]。
修改后的代码如下所示:
```python
import numpy as np
import cv2
import glob
CHECKERBOARD = (6, 9)
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0, :, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
objpoints = []
imgpoints = []
images = glob.glob('./image/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH +
cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
imgpoints.append(corners2)
img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
h, w = img.shape[:2]
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (w, h), None, None)
print("Camera matrix : \n")
print(mtx)
print("dist : \n")
print(dist)
print("rvecs : \n")
print(rvecs)
print("tvecs : \n")
print(tvecs)
```
希望以上修改可以帮到你,如果还有其他问题,可以随时问我。