当我试图找到位于我的棋盘上的 3D 点与其在相机拍摄的图像上的位置之间的对应关系时,我遇到了一个问题。
这是我所做的:
我用方法
corners = cv.FindChessboardCorners(frameGray, patternSize, cv.CV_CALIB_CB_ADAPTIVE_THRESH + cv.CV_CALIB_CB_NORMALIZE_IMAGE)
这给了我棋盘所有内角的位置。因为我知道他们在现实世界中的位置,所以我想进一步使用 solvePnP 方法来找到相机姿势。
但是,我注意到“角顺序”会根据棋盘的方向而变化。我想在我的“第一个”角上画一个绿色圆圈,但那个“第一个”角因我的棋盘方向而异。
这里有一些截图来解释我在说什么:
这是完整的代码:
import cv
patternSize = (7,7)#interior number of corners, that is, points, where the black squares touch each other
cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
camera_index = 0
capture = cv.CaptureFromCAM(camera_index)
c = cv.WaitKey(5000)#wait for the camera to be initialized
def repeat():
global capture #declare as globals since we are assigning to them now
global camera_index
global frame
frame = cv.QueryFrame(capture)
if frame:
cv.ShowImage("w1", frame)
#convert to grayImage
frameGray = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1)
cv.CvtColor(frame,frameGray,cv.CV_BGR2GRAY)
corners = cv.FindChessboardCorners(frameGray, patternSize, cv.CV_CALIB_CB_ADAPTIVE_THRESH + cv.CV_CALIB_CB_NORMALIZE_IMAGE)
if (len(corners[1]) == patternSize[0]*patternSize[1]):#if we found all the internal corners
#Refines the corner locations
#cv.FindCornerSubPix(frameGray,corners[1],(11,11),(-1,-1),(cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 10, 0.01))
point = int(corners[1][0][0]), int(corners[1][0][1])
print (point)
patternWasFound = corners[0]
#cv.DrawChessboardCorners(frame, patternSize, corners[1], patternWasFound)
cv.Circle(frame, point, 4, (0, 255, 0), -1)
cv.ShowImage("w1",frame)
c = cv.WaitKey(10)
while True:
repeat()
如您所见,我总是选择相同的角(int(corners 1 [0][0]),int(corners 1 [0] 1)),但它会根据我的棋盘方向而变化。
有没有人知道为什么?如果拐角位置发生变化,我就无法知道对应的真实坐标:/
谢谢 !