와 StereoBM와 dispairty 맵을 만들 수 있습니다. 그러나 두 이미지 간의 이동은 단순히 왼쪽에서 오른쪽 또는 위/아래가 아니라 두 가지의 조합으로 이루어집니다. Open CV Python에서 StereoBM 기능을 사용하려고했지만 결과에 이미지의 대각선 흑백 선이 생깁니다. 제 질문은, 불일치 맵을 계산하기 위해 시차가 대각선 방향 인 두 개의 이미지를 사용할 수 있습니까? 아니면이 기능이 작동하려면 이미지를 회전해야합니까?열기를 사용하여 CV 파이썬은 내가 스테레오 쌍을 가지고 변이지도를 만들고 싶습니다 대각선 시차
편집 : 아래의 답변을 읽고, 어떤 연구를하고 후, 나는 stereoRectifyUncalibrated 기능을 사용하기로 결정했습니다. 먼저 SURF를 사용하여 첫 번째 이미지에서 핵심 포인트를 찾은 다음 두 번째 이미지에서이 작업을 반복합니다. 그런 다음 FLANN 기반 정규 표현식을 사용하여 점을 일치시키고 특이점을 제거합니다. 그런 다음 findFundamentalMat 함수를 사용하여 기본 매트를 찾은 다음 stereoRectifyUncalibrated를 호출합니다. 그러나, 나는 이런 식으로 시작하는 오류 얻을 : (-215) CV_IS_MAT (_points1) & & CV_IS_MAT (_points2) & & (_points1-> 행의 == 1 || _points1-> COLS == 1) & & ...
가 나는 모든의 데이터 유형이 동일한 지, 각 지점의 배열이 동일한 차원이 있는지 확인 만들었습니다. 아래 코드를 사용하여 stereoRectifyUncalibrated를 사용합니다.
#Detect feature points with SURF
detector = cv2.SURF()
kp1, desc1 = detector.detectAndCompute(img1, None)
kp2, desc2 = detector.detectAndCompute(img2, None)
#Match Points
FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing
flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
matcher = cv2.FlannBasedMatcher(flann_params, {})
matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k=2)
mkp1, mkp2 = [], []
ratio = 0.75
for m in matches:
if len(m) == 2 and m[0].distance < m[1].distance * ratio:
m = m[0]
mkp1.append(kp1[m.queryIdx])
mkp2.append(kp2[m.trainIdx])
np.float32([kp.pt for kp in mkp1])
p1 = np.float32([kp.pt for kp in mkp1])
p2 = np.float32([kp.pt for kp in mkp2])
kp_pairs = zip(mkp1, mkp2)
H, status = cv2.findHomography(p1, p2, cv2.RANSAC, 5.0)
print '%d/%d inliers/matched' % (np.sum(status), len(status))
statusmat = np.zeros((max(status.shape),2),dtype = np.float64)
statusmat[:,0] = status[:,0]
statusmat[:,1] = status[:,0]
status = np.array(status, dtype=bool)
p1f=p1[status.view(np.ndarray).ravel()==1,:] #Remove Outliers
p2f=p2[status.view(np.ndarray).ravel()==1,:] #Remove Outliers
#Attempt to rectify using stereoRectifyUncalibrated
fundmat, mask = cv2.findFundamentalMat(p1f,p2f,cv2.RANSAC,3,0.99,)
rectmat1, rectmat2 = cv2.stereoRectifyUncalibrated(p1f,p2f,fundmat,imgsize)
답변 주셔서 감사합니다!
는'stereoRectify'를 사용하여 화상 스테레오 정류 (실시 했을 보인다 ANX하지 행 또는 열 벡터 걸리는 것으로 보인다 ([문서] (http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereorectify)) 또는'stereoRectifyUncalibrated' ([의사 (http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction .html # stereorectifyuncalibrated))) StereoBM을 사용하기 전에? – AldurDisciple
안녕하세요. stereoRectifyUncalibrated 메소드를 사용해 보았습니다. 바둑판 패턴을 사용하여 교정 할 수 없습니다. 필자는 SURF에 의해 생성되고 FLANN 정규 표현식과 일치되는 특징점을 사용하여 기본 매트릭스를 만들었습니다. 나는 stereoRectifyUncalibrated 기능을 실행하려고 할 때, 나는 오랫동안 같이 시작 오류 얻을 : (-215) CV_IS_MAT (_points1) && CV_IS_MAT (_points2를) && (_points1-> 행 == 1 || _points1-> COLS = = 1) && .... 이 함수는 함수가 기본 행렬을 받아들이지 않는 버그 일지 모르지만 해결책을 찾을 수는 없습니다. – Jetstar
이 오류는 기본 매트릭스가 아닌 함수에 제공하는 포인트 배열과 관련이있는 것으로 보입니다. 그것은 진실이어야하지만 거짓 인 것으로 판명 된 주장을 보여줍니다. 질문을 편집하고'stereoRectifyUncalibrated'를 호출하는 방법을 보여줄 수 있습니까? – AldurDisciple