OpenCV3中StereoBM函数的用法

本文介绍OpenCV 3.0版本中StereoBM模块的变化,包括删除了StereoBMState等类,StereoBM实例化的改变及参数设置方式。还提供了实例代码演示如何使用新的StereoBM类进行视差计算,并将结果转换为32位浮点数。
OpenCV更新到3.0版本后,Stereo模块变化的挺多的,首先去掉了StereoBMState和StereoSGBMState这两个专门控制BM和SGBM算法参数的类,而且StereoBM不能直接声明实例,需要放到智能指针里cv::Ptr<cv::StereoBM>声明才行,而且不能直接通过访问state来访问参数,只能通过setter和getter方法来设置和获取参数,参考下面这段实例代码:
cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16,9);

// setter
bm->setPreFilterType(CV_STEREO_BM_NORMALIZED_RESPONSE);
bm->setPreFilterSize(9);
bm->setPreFilterCap(31);
bm->setBlockSize(21);
bm->setMinDisparity(-16);
bm->setNumDisparities(64);
bm->setTextureThreshold(10);
bm->setUniquenessRatio(5);
bm->setSpeckleWindowSize(100);
bm->setSpeckleRange(32);
bm->setROI1(roi_left);
bm->setROI2(roi_right);

// getter
int pfs = bm->getPreFilterSize();
int pfc = bm->getPreFilterCap();
int bs = bm->getBlockSize();
int md = bm->getMinDisparity();
int nd = bm->getNumDisparities();
int tt = bm->getTextureThreshold();
int ur = bm->getUniquenessRatio();
int sw = bm->getSpeckleWindowSize();
int sr = bm->getSpeckleRange();

// Compute disparity
bm->compute(left, right, disp);

注意新版本下的BM和SGBM方法计算出的视差都是CV_16S格式的,使用32位float格式可以得到真实的视差值,所以我们需要除以16,需要加上下面一行代码:

// Convert
disp.convertTo(disp, CV_32F, 1.0/16);


转载链接:https://www.cnblogs.com/grandyang/p/5805261.html



### 关于C#与OpenCV3D方面的集成 对于C#与OpenCV在三维(3D)方面集成的需求,通常涉及计算机视觉库的绑定以及特定场景的应用开发。虽然提及的内容主要围绕Python及其调用C代码的方式[^1],但针对.NET环境下的应用,尤其是C#语言,可以采用不同的方法来实现这一目标。 #### 使用Emgu CV作为桥梁 一种常见做法是利用专门为.NET设计并封装好的OpenCV接口——Emgu CV。该工具不仅简化了原生OpenCV函数到托管代码(C#)之间的转换过程,还提供了额外的功能支持,包括但不限于3D重建、立体匹配等高级特性。通过这种方式,在C#项目中可以直接操作图像数据,并执行复杂的几何变换或特征提取任务。 ```csharp using Emgu.CV; using Emgu.CV.Structure; // 加载两幅视图图片用于创建3D模型 Mat imgLeft = CvInvoke.Imread("left_image.png", ImreadModes.AnyColor); Mat imgRight = CvInvoke.Imread("right_image.xml", ImreadModes.AnyColor); StereoBM stereoBm = new StereoBM(); stereoBm.PreFilterSize = 5; stereoBm.SADWindowSize = 9; stereoBm.MinDisparity = 0; stereoBm.NumDisparities = 64; // 必须是16的倍数 // 计算视差图 Mat disparityMap = new Mat(); stereoBm.Compute(imgLeft, imgRight, disparityMap); // 显示结果 CvInvoke.Imshow("Disparity Map", disparityMap); CvInvoke.WaitKey(0); ``` 此段代码展示了如何基于一对立体相机拍摄得到的画面计算其间的差异(disparity),进而推断物体距离信息,这是构建3D场景的基础之一。 #### 设置必要的依赖项 为了确保上述功能正常运作,除了安装好对应版本的Emgu CV外,还需要配置正确的头文件和静态链接库路径。这一步骤类似于设置其他外部库时的做法,即指定包含目录和库文件位置[^2]。具体来说: - 将`FastDeploy`及相关第三方组件(如OpenCV)的`.h`文件加入编译器预处理器搜索列表; - 同样地,把对应的`.lib`文件所在地址告知链接程序; 以上措施有助于解决可能出现的各种找不到符号定义等问题,从而顺利完成整个项目的搭建工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值