我试图从未校准的方法获得深度图.我可以通过SIFT方法和不同的对应点获得基本矩阵cv2.findFundamentalMat.然后cv2.stereoRectifyUncalibrated我可以得到整流矩阵.最后我可以cv2.warpPerspective用来纠正和计算差异,但后者没有进行到一个好的深度图...值非常高,所以我想知道我是否必须使用warpPerspective或我必须从单应矩阵计算旋转矩阵得到`stereoRectifyUncalibrated .
所以我不确定投影矩阵与单体矩阵的情况下获得的"stereoRectifyUncalibrated"`来纠正...
代码的一部分:
#Obtainment of the correspondent point with SIFT
sift = cv2.SIFT()
###find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(dst1,None)
kp2, des2 = sift.detectAndCompute(dst2,None)
###FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
good = []
pts1 = []
pts2 = []
###ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance …Run Code Online (Sandbox Code Playgroud) 我是Stereo Matching的新手.我无法理解Disparity的概念.请告诉我什么是视差图和视差图像,它们之间有什么区别?两个术语是相同还是不同?
我被要求实现基于边缘的视差图,但我从根本上不了解视差图是什么.谷歌搜索似乎没有产生直截了当的答案.有人可以解释它还是指向更好的资源?
imaging image-processing computer-vision disparity-mapping stereo-3d
在OpenCV文档中没有充分解释Konolige的块匹配算法的应用.CvStereoBMState的参数影响由cv :: StereoBM计算的差异的准确性.但是,没有记录这些参数.我将在下面列出这些参数并描述,我理解的内容.也许有人可以添加参数的描述,这些都不清楚.
我正在opencv做一个项目来检测使用立体声校准的盲人路径中的障碍物.我已经正确地计算了视差图.现在要找到障碍物距离相机的距离,我想要它的3D坐标[X,Y,Z],我猜是可以通过reprojectImageTo3D()找到,但是我没有Q矩阵在这个函数中使用,因为我从stereoRectify()获得的Q矩阵可能因为我使用预校准图像而变为零.虽然我确实拥有相机的内在和外在参数.所以我的问题是,如果我知道焦距,基线以及我相机的其他所有内容,如何手动创建Q矩阵以直接在函数reprojectImageTo3D()中使用?Q矩阵的基本格式是什么?
我一直在使用用于OpenCV的伟大的Emgu C#包装器来收集家用立体声装备的图像.两个网络摄像头用螺栓固定在一块35厘米的木头上,希望能让我在10-20米范围内制作深度图.我将它们设置为尽可能平行(三角测试大约89.3度).
我正在尝试从这些中制作视差图,尽管该过程作为代码起作用,但结果非常随机.我的意思是每当我尝试运行立体声整流时,我会得到非常不同的结果,而且图像经常如此严重扭曲,屏幕上几乎看不到任何东西.
据我了解,这样做的方法如下:
1)打印出棋盘图案(例如6个8个内角) - 粘在平坦的东西上.
2)从相机1拍摄一组约10张照片,在全景但不同的位置拿着棋盘.
3)使用CameraCalibration.FindChessboardCorners查找内角(6乘8)
4)使用img.FindCornerSubPix()将这些角位置细化为子像素级别
5)使用CameraCalibration.CalibrateCamera()计算内在的摄像头细节,并将其保存为XML文件
6)对相机2重复上述步骤.
7)现在您有内部摄像机失真信息,您可以拍摄立体照片对,并使用CameraCalibration.StereoCalibrate()和先前计算的内在数据来计算外部信息(摄像机1和2之间的偏移和旋转).
8)使用CvInvoke.cvStereoRectify()和CvInvoke.cvInitUndistortRectifyMap()然后使用CvInvoke.cvRemap()来构建一个输出图像,该图像应该在Y中排成一行,这样您就可以运行其中一个立体对应测试.
我发现你需要使用Emgu 2.1 ver 806来使cvStereoRectify工作而不会出现访问冲突错误.
我想我的问题是:
A)我的流程是否正确?我一直在做相机固有校准作为一个单独的过程,因为相机相距35厘米,因为它们在办公室中并且很多时候移动它而不容易获得棋盘...因为它很快离开了其中一个相机视图.我认为由于值是固有的,因此它们与相机有关,因此应转移到立体声程序OK.它是否正确?
看起来内部值在cvStereoRectify过程中会发生变化,并且变得非常不同.
例如.cvStereoRectify后,第一阶段的失真值= 0.22,-1.2,0.01,-0.01,2.6,值变为= 10,-489,-0.03,-0.09,13208
我不是专家,但第一套看起来更像是我从其他人的评论中看到的,第二套似乎很明显!
B)有没有办法阻止在cvStereoRectify期间更新内在+失真值?
C)这似乎是正确的内在价值(937,0,290,0,932,249,0,0,1)?
非常感谢任何提示...我已经坚持了一段时间了......我真的不确定这个过程的哪个部分会引发错误.任何提示或建议都将非常受欢迎......
我正在从事立体视觉任务,我想了解立体视觉相机和物体之间的距离。我正在将Matlab与计算机视觉系统工具箱一起使用。
我已经使用“适用于Matlab的相机校准工具箱”对相机进行了校准,因此我具有左右相机的固有参数和外部参数(右相机相对于左相机的位置)。我也有一副校正过的图片和他们的视差图。为了估计视差,我使用了Matlab函数disparity()。我知道相机的基线和焦距,但是我的结果仍然是错误的。
baseline = 70 mm
focal length = 25 mm
disparity = 60 pixels
---------------------
depth = baseline * focal length / disparity = 70 * 25 / 60 = 29 mm
Run Code Online (Sandbox Code Playgroud)
但我知道距离是cca 600毫米。这个公式对吗?单位呢?mm * mm / pixel != mm。特别是我想使用Camera矩阵(内在参数)进行计算,但是我不知道该怎么做。如有任何提示,我将不胜感激。
我试图了解 opencv 的视差映射函数我遇到了两种方法 cv2.StereoSGBM_create 和 cv2.StereoBM_create 我不太明白其中的区别。
另外,numDisparities 或 setSpeckleRange 等函数的属性是什么?
我尝试根据来自KITTI立体图像数据集的图像创建点云,以便稍后我可以估计某些对象的 3D 位置。
原始图像看起来像这样。
到目前为止我所拥有的:
window_size = 9
minDisparity = 1
stereo = cv2.StereoSGBM_create(
blockSize=10,
numDisparities=64,
preFilterCap=10,
minDisparity=minDisparity,
P1=4 * 3 * window_size ** 2,
P2=32 * 3 * window_size ** 2
)
Run Code Online (Sandbox Code Playgroud)
window_size = 9
minDisparity = 1
stereo = cv2.StereoSGBM_create(
blockSize=10,
numDisparities=64,
preFilterCap=10,
minDisparity=minDisparity,
P1=4 * 3 * window_size ** 2,
P2=32 * 3 * window_size ** 2
)
Run Code Online (Sandbox Code Playgroud)
生成的矩阵如下所示(此时我怀疑它是否正确):
[[ 1. 0. 0. …Run Code Online (Sandbox Code Playgroud) 我正在尝试AVDepthData根据以下方程估计对象的绝对深度(以米为单位):depth = baseline x focus_length / (disparity + d_offset)。我有来自 的所有参数cameraCalibrationData,但是这是否仍然适用于使用 iPhone X 在人像模式下拍摄的图像,因为两个摄像头垂直偏移?同样基于WWDC 2017 Session 507,视差图是相对的,但AVDepthData文档指出视差值在 1/m 中。那么我可以按原样将方程应用于深度数据中的值,还是需要事先进行一些额外的处理?
var depthData: AVDepthData
do {
depthData = try AVDepthData(fromDictionaryRepresentation: auxDataInfo)
} catch {
return nil
}
// Working with disparity
if depthData.depthDataType != kCVPixelFormatType_DisparityFloat32 {
depthData = depthData.converting(toDepthDataType: kCVPixelFormatType_DisparityFloat32)
}
CVPixelBufferLockBaseAddress(depthData.depthDataMap, CVPixelBufferLockFlags(rawValue: 0))
// Scale Intrinsic matrix to be in depth image pixel space
guard var intrinsicMatrix = depthData.cameraCalibrationData?.intrinsicMatrix …Run Code Online (Sandbox Code Playgroud)