- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 StereoBM 获取两幅图像的视差图。我尝试了一些示例代码和图像。他们工作正常。然而,当我尝试自己的图像时,我得到了非常糟糕的 map ,非常嘈杂。
我的 StereoBM 参数
sbm.state->SADWindowSize = 25;
sbm.state->numberOfDisparities = 128;
sbm.state->preFilterSize = 5;
sbm.state->preFilterCap = 61;
sbm.state->minDisparity = -39;
sbm.state->textureThreshold = 507;
sbm.state->uniquenessRatio = 0;
sbm.state->speckleWindowSize = 0;
sbm.state->speckleRange = 8;
sbm.state->disp12MaxDiff = 1;
我的问题是
谢谢。
这是我的纠正图像的代码
Mat img_1 = imread( "image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( "image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );
int minHessian = 430;
SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect( img_1, keypoints_1 );
detector.detect( img_2, keypoints_2 );
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute( img_1, keypoints_1, descriptors_1 );
extractor.compute( img_2, keypoints_2, descriptors_2 );
//-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_L1, true); //BFMatcher matcher(NORM_L2);
std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < matches.size(); i++ )
{ double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
std::vector< DMatch > good_matches;
vector<Point2f>imgpts1,imgpts2;
for( int i = 0; i < matches.size(); i++ )
{
if( matches[i].distance <= max(4.5*min_dist, 0.02) ){
good_matches.push_back( matches[i]);
imgpts1.push_back(keypoints_1[matches[i].queryIdx].pt);
imgpts2.push_back(keypoints_2[matches[i].trainIdx].pt);
}
}
std::vector<uchar> status;
cv::Mat F = cv::findFundamentalMat(imgpts1, imgpts2, cv::FM_8POINT, 3., 0.99, status); //FM_RANSAC
Mat H1,H2;
cv::stereoRectifyUncalibrated(imgpts1, imgpts1, F, img_1.size(), H1, H2);
cv::Mat rectified1(img_1.size(), img_1.type());
cv::warpPerspective(img_1, rectified1, H1, img_1.size());
cv::Mat rectified2(img_2.size(), img_2.type());
cv::warpPerspective(img_2, rectified2, H2, img_2.size());
StereoBM sbm;
sbm.state->SADWindowSize = 25;
sbm.state->numberOfDisparities = 128;
sbm.state->preFilterSize = 5;
sbm.state->preFilterCap = 61;
sbm.state->minDisparity = -39;
sbm.state->textureThreshold = 507;
sbm.state->uniquenessRatio = 0;
sbm.state->speckleWindowSize = 0;
sbm.state->speckleRange = 8;
sbm.state->disp12MaxDiff = 1;
Mat disp,disp8;
sbm(rectified1, rectified2, disp);
校正后的图像和视差图在这里
最佳答案
您的图片没有特别的问题。但是,如果计算时间不是很重要,我建议您使用更大的分辨率。另外,如果可能的话,你最好给我们一个未压缩的图像格式。
您校准立体相机以校正您的立体图片。你确实需要纠正图片,但也可以在没有校准相机的情况下纠正它们。如果您只有几张图片要处理,您可以在 Photoshop 或类似软件中通过移动或旋转图像来完成,使匹配点位于同一条线上。如果您有更多的图片要处理,您可以像在代码中尝试的那样处理。
我没有详细查看你的代码,但我想你应该检查匹配点是否在同一行。
在您的示例图片中,情况确实如此,使用 StereoSGMB 而不是 StereoBM 我得到了一些更好但仍然非常嘈杂的结果。
要在 StereoSGMB 中获得良好的结果,需要进行一些参数调整。另请注意,后面的 block 的结果比前面的对象好得多,因为 block 具有纹理表面。
这是我使用的参数:
Ptr<StereoSGBM> sgbm = StereoSGBM::create(0, //int minDisparity
96, //int numDisparities
5, //int SADWindowSize
600, //int P1 = 0
2400, //int P2 = 0
20, //int disp12MaxDiff = 0
16, //int preFilterCap = 0
1, //int uniquenessRatio = 0
100, //int speckleWindowSize = 0
20, //int speckleRange = 0
true); //bool fullDP = false
sgbm->compute(left, right, disp);
关于opencv - 使用 opencv StereoBM 的差视差图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35904437/
我看过很多关于这个问题的帖子,但这个是不同的。我的代码适用于一对图像,但不适用于另一对图像。 稍后,我想将两个摄像头的视频输入转换为立体声输出。我试过了,但也有与下面显示的图像(第二对图像)相同的问题
result left right import numpy as np import cv2 imgL = cv2.imread("C:/Users/admin/jupyter/c
我正在使用这段代码来计算两幅图像之间的差异: l1 = cv2.cvtColor(imgL, cv2.COLOR_BGR2GRAY) l2 = cv2.cvtColor(imgR, cv2.COLOR
我正在尝试在 OpenCV 中使用 StereoBM 从一对图像中提取视差图。忽略下面的视差图质量不好,你可以看到它的左边有一些黑色的柱子对应于参数 ndisparities。我认为 ndispari
我正在尝试增强 stereobm(Opencv 立体 block 匹配)。他们声称该算法使用 SAD cost_function 方法。 (ABOSLUE 差异的 SAD 总和)。 但是在代码中他们以
如果我像这样 decalre 一个 stereoBM 的实例 cv::StereoBM bmState; 编译器抛出错误: cannot declare field ‘bmState’ to be o
我一直致力于使用 StereoBM 类根据两个摄像头输入源生成视差图。 我可以创建一个指向变量 StereoBM *sbm;但是每当我调用一个函数时,都会出现发布版本的段错误。由于 malloc():
我正在尝试使用 StereoBM 获取两幅图像的视差图。我尝试了一些示例代码和图像。他们工作正常。然而,当我尝试自己的图像时,我得到了非常糟糕的 map ,非常嘈杂。 我的 StereoBM 参数 s
作为我项目的一部分,我将 SteroBM 类用于立体视觉。我正在从 2 个网络摄像头获取输入帧,并在不进行校正的情况下对输入帧灰度帧运行立体 block 匹配计算。我得到的输出与基本事实相去甚远(非常
我组装了一个立体摄像头装置,但在使用它制作良好的视差图时遇到了问题。这是两个校正后的图像和我用它们制作的视差图的示例: 如您所见,结果非常糟糕。更改 StereoBM 的设置不会有太大变化。 设置 两
我正在使用 opencv 库进行立体重建。我目前正在测试整流和立体匹配。我使用了 opencv 2.4.9 中的 stereoRectify 函数,我让它工作正常。我使用了来自该站点的测试数据: ht
Konolige 的 block 匹配算法的应用在 OpenCV 文档中没有充分解释。 CvStereoBMState 的参数影响由 cv::StereoBM 计算的差异的准确性。但是,没有记录这些参
当我初始化 StereoBM 对象时,出现错误“无法定义抽象类的对象”。我检查了 calib3d.hpp,发现 StereoBM 是一个抽象类。请给我一个解决方案,如何在 StereoBM 类中定义所
这是我的测试代码,用于实现一个简单的 testBM 算法,没有预过滤。但当窗口尺寸较大时,它需要大约 400 毫秒甚至更多,而 opencv 的 StereoBM(CPU 而非 GPU)需要 20 毫
我正在运行 cv::cuda::StereoBM,它可以在 Tesla K80 上运行。 (计算能力 3.7。)完全相同的代码,具有完全相同的系统库,它卡在 Geforce RTX 2080 Ti 上
我需要你的帮助来解决 OpenCV cv::StereoBM 中的一个问题,因为当我尝试编译以下代码时遇到错误: std::string myImgLeftString = myImgLeft.to
我是一名优秀的程序员,十分优秀!