-2 python opencv camera-calibration
我对下面的代码有问题。编译后,出现消息“ret,mtx,dist,rvecs,tvecs = cv2.calibrateCamera(objectpoints,framepoints,fsize,None,None)” TypeError:函数只需要2个参数(给定3个)”。我希望从我的网络摄像头实时拍摄图像
import numpy as np
import cv2
objp = np.zeros((9 * 6, 3), np.float32)
objp[:, :2] = np.mgrid[0:6, 0:9].T.reshape(-1, 2)
size = (9, 6)
objectpoints = []
framepoints = []
cv2.namedWindow("video preview")
vc = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (1080, 720))
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
while rval:
cv2.imshow("preview", frame)
rval, frame = vc.read()
ret, corners = cv2.findChessboardCorners(frame, size, None)
cv2.drawChessboardCorners(frame, (9, 6), corners, ret)
print(ret)
print(frame.shape[::-1])
fsize = frame.shape[::-1]
if ret == True:
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objectpoints.append(objp)
corners2 = cv2.cornerSubPix(frame, corners, (11, 11), (-1, -1), criteria)
framepoints.append(corners2)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objectpoints, framepoints, fsize, None, None)
print('ret:', ret)
print('mtx:', mtx)
print('dist:', dist)
print('rvecs:', rvecs)
print('tvecs:', tvecs)
out.write(frame)
key = cv2.waitKey(20)
if key == 27:
break
vc.release()
out.release()
cv2.destroyWindow("preview")`
Run Code Online (Sandbox Code Playgroud)
小智 5
我遇到了同样的问题并发现了问题:
您将 fsize 作为 img 大小参数传递,该参数需要 2 元素元组(宽度,高度)
但是您从 RGB img 中读取 fsize,结果是 3 个颜色通道的 (width,height,3)。(如果你打印(fsize)你会看到)
因此,您传递了一个 3 元组,而预期是 2 元组,这会导致错误
更改您的线路:
fsize = frame.shape[::-1]
到:
fsize = frame.shape[1::-1]
它应该有效。
您还可以通过以下方式将帧转换为灰度:
frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
这可能与 chessboardcornerDetector 配合使用效果更好(在示例中https://docs.opencv.org/4.1.1/dc/dbb/tutorial_py_calibration.html就是这样使用的)
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
3107 次 |
| 最近记录: |