2

チェス盤上の 3D ポイントと、カメラで撮影した画像上のその位置との対応を見つけようとすると、問題に直面します。

これが私がすることです:

メソッドを使用します

corners = cv.FindChessboardCorners(frameGray, patternSize, cv.CV_CALIB_CB_ADAPTIVE_THRESH + cv.CV_CALIB_CB_NORMALIZE_IMAGE)

これにより、チェス盤のすべての内側の角の位置がわかります。現実世界での位置はわかっているので、さらに solvePnP メソッドを使用してカメラのポーズを見つけたいと思います。

しかし、チェス盤の向きによって「角の順番」が変わることに気付きました。「最初の」コーナーに緑色の円を描きたいのですが、その「最初の」コーナーはチェス盤の向きによって異なります。

ここに、私が話していることを説明するためのスクリーンショットをいくつか示します。

http://i.imgur.com/cYtUIDy.png http://i.imgur.com/04wvzL7.png

そして、ここに完全なコードがあります:

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 )) を取りますが、チェス盤の向きによって変化します。

理由を知っている人はいますか?コーナーの位置が変わると、対応する実際の座標がわかりません:/

ありがとうございました !

4

0 に答える 0