필자의 상황에서는 OpenCV StereoBM Depth Map에 의해 반환 된 데이터가 매개 변수 튜닝에 관계없이 의미가 없습니다.StereoBM과 함께 사용하려면 카메라를 보정해야합니까?
저는 OpenCV를 사용하고 입체감을 사용하여 깊이 맵을 생성하는 디자인 프로젝트에 대한 연구를하고 있습니다. 나는 현재 내 웹 카메라를 모두로드하고 StereoBM을 사용하여 깊이 맵을 생성 할 수있었습니다. 그러나 결과 화면은 내 스크린 샷이 아래에 나와있는 것처럼 유용하지 않습니다. 그래서 도움이되지 않은 StereoBM 매개 변수를 조정하는 데 도움이되는 작은 파이썬 응용 프로그램을 만들었습니다.
내 질문 StereoBM 기능과 함께 사용하려면 카메라를 보정해야합니까? 그렇지 않으면
는에 명시된 바와 같이
코드
import cv2
import time
import numpy as np
from Tkinter import *
oldVal = 15
def oddVals(n):
global oldVal
n = int(n)
if not n % 2:
window_size.set(n+1 if n > oldVal else n-1)
oldVal = window_size.get()
minDispValues = [16,32,48,64]
def minDispCallback(n):
n = int(n)
newvalue = min(minDispValues, key=lambda x:abs(x-float(n)))
min_disp.set(newvalue)
# Display the sliders to control the stereo vision
master = Tk()
master.title("StereoBM Settings");
min_disp = Scale(master, from_=16, to=64, command=minDispCallback, length=600, orient=HORIZONTAL, label="Minimum Disparities")
min_disp.pack()
min_disp.set(16)
window_size = Scale(master, from_=5, to=255, command=oddVals, length=600, orient=HORIZONTAL, label="Window Size")
window_size.pack()
window_size.set(15)
Disp12MaxDiff = Scale(master, from_=5, to=30, length=600, orient=HORIZONTAL, label="Max Difference")
Disp12MaxDiff.pack()
Disp12MaxDiff.set(0)
UniquenessRatio = Scale(master, from_=0, to=30, length=600, orient=HORIZONTAL, label="Uniqueness Ratio")
UniquenessRatio.pack()
UniquenessRatio.set(15)
SpeckleRange = Scale(master, from_=0, to=60, length=600, orient=HORIZONTAL, label="Speckle Range")
SpeckleRange.pack()
SpeckleRange.set(34)
SpeckleWindowSize = Scale(master, from_=60, to=150, length=600, orient=HORIZONTAL, label="Speckle Window Size")
SpeckleWindowSize.pack()
SpeckleWindowSize.set(100)
master.update()
vcLeft = cv2.VideoCapture(0) # Load video campture for the left camera
#vcLeft.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,420);
#vcLeft.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,340);
vcLeft.set(3,640) # Set camera width
vcLeft.set(4,480) # Set camera height
vcRight = cv2.VideoCapture(1) # Load video capture for the right camera
#vcRight.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,420);
#vcRight.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,340);
firstTime = time.time() # First time log
totalFramesPassed = 0 # Number of frames passed
if vcLeft.isOpened() and vcRight.isOpened():
rvalLeft, frameLeft = vcLeft.read()
rvalRight, frameRight = vcRight.read()
else:
rvalLeft = False
rvalRight = False
while rvalLeft and rvalRight: # If the cameras are opened
rvalLeft, frameLeft = vcLeft.read()
rvalRight, frameRight = vcRight.read()
cv2.putText(frameLeft, "FPS : " + str(totalFramesPassed/(time.time() - firstTime)),(40, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.8, 150, 2, 10)
cv2.imshow("Left Camera", frameLeft)
cv2.putText(frameRight, "FPS : " + str(totalFramesPassed/(time.time() - firstTime)),(40, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.8, 150, 2, 10)
cv2.imshow("Right Camera", frameRight)
frameLeftNew = cv2.cvtColor(frameLeft, cv2.COLOR_BGR2GRAY)
frameRightNew = cv2.cvtColor(frameRight, cv2.COLOR_BGR2GRAY)
num_disp = 112 - min_disp.get()
stereo = cv2.StereoBM_create(numDisparities = num_disp, blockSize = window_size.get())
stereo.setMinDisparity(min_disp.get())
stereo.setNumDisparities(num_disp)
stereo.setBlockSize(window_size.get())
stereo.setDisp12MaxDiff(Disp12MaxDiff.get())
stereo.setUniquenessRatio(UniquenessRatio.get())
stereo.setSpeckleRange(SpeckleRange.get())
stereo.setSpeckleWindowSize(SpeckleWindowSize.get())
disparity = stereo.compute(frameLeftNew, frameRightNew).astype(np.float32)/16.0
disp_map = (disparity - min_disp.get())/num_disp
cv2.imshow("Disparity", disp_map)
master.update() # Update the slider options
key = cv2.waitKey(20)
totalFramesPassed = totalFramesPassed + 1 # One frame passed, increment
if key == 27:
break
vcLeft.release()
vcRight.release()
갖는 카메라 보정 : 사람이 미래에 자신의 카메라를 보정해야하는 경우
, 당신은 당신이 그렇게 할 수 있도록이 코드를 사용할 수 있습니다. 랜덤 한 장면 (텍스트, 랜덤 점 등)을 사용하여 StereoBM을 사용하려고 했습니까? 아마도 대응에 문제가있을 수 있습니다. 나는 간단한 상관 알고리즘을 구현하고 얼마나 좋은 코 릴레이션인지를 보게 될 것이다. –
@KamilSzelag 조언을 주셔서 감사합니다. 나는 두 이미지의 왼쪽과 오른쪽 이미지를 보정하려고 시도합니다. 그러면 알고리즘이 잘 작동 할 수 있습니다. StereoBM을 다른 장면과 함께 사용하려고 시도했지만 상관 관계가 좋은지 확인합니다. 현장에서 많은 물체가있는 상황에서도 현재 결과가 신뢰할 수 없기 때문에 교정이 주요 문제가되기를 바랍니다. 다시 한번 감사드립니다. –