\tutorial_code\ImgProc\Smoothing.cpp

首先分享一下

难道大家没有疑惑?
在编程之前,究竟要包含哪几个头文件呢?

先看一下各模块包含有什么

core: 一些基本数据结构,如矩阵,向量等。这部分很重要,一定要比较熟悉,特别是矩阵类型Mat, 就像Matlab里面的矩阵对matlab的作用一样。
highgui: 一些图像、视频的读、写、显示接口。2.0版本后改装的有点像Matlab的函数。如读写图像的imread, imwrite跟matlab一模一样。
imgproc: 正如其名,是图像处理模块,有常见的图像处理功能,如滤波,变换等。
features2d: 图像的特征检测,描述等。如SIFT,SURF等。
calib3d: 摄像机标定,图像配准,三维重建等,
objdetect: 对象检测。
ml: 机器学习模块,有各种主流分类器,如SVM,贝叶斯,神经网络,boosting等。
flann: 寻找k近邻的快速算法
gpu: gpu加速


===========我只是想插入 ===========

當然啊,這篇日誌發的時候已經2.4.5了。

我最近在做的超分辨率也加入了。

好期待再多幾個功能啊,

這樣我的畢業論文就輕鬆很多

啊哈哈哈

=========================


所以吧

这两个应该是必备的

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


然后就各取所需咯

参阅资料:
科研工具

http://vcc.siat.ac.cn/zh/%E7%A7%91%E7%A0%94%E5%B7%A5%E5%85%B7/






另外还分享一个小白问题

为啥无法调试,每次都要直接启动程序才能运行成功,
装载图片那一段如果是单步调试都是出错?

问题已解决,
working dierctory应该指向项目目录,而不是debug.

请参阅:
http://www.opencv.org.cn/forum/viewtopic.php?t=14306



【10】Smoothing.cpp

E:\Program Files\OpenCV2.3.1\opencv\samples\cpp\tutorial_code\ImgProc

原理啊,献上真相

                                                             Original Image






真理就是:
==================================
不妨把 滤波器 想象成一个包含加权系数的窗口,
当使用这个滤波器平滑处理图像时,
就把这个窗口滑过图像。

就是所謂的空間濾波啦!!!
=================================

1 归一化块滤波器 (Normalized Box Filter)

最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等)

void blur(const Mat& src, Mat& dst, Size ksize, Point anchor=Point(-1, -1), int borderType=BORDER_DEFAULT)

Parameters:
src – 原图像
dst – 目标图像; 和原图像同样大小
ksize – 滤波矩形核 ksize.height ksize.width
anchor – anchor为定标点,如果采用的是Point(-1,-1)则默认为核的中心点,
borderType – 边缘模式的展开

                                                             Homogeneous Blur






2 高斯滤波器 (Gaussian Filter)

最有用的滤波器 (尽管不是最快的)。

void GaussianBlur(const Mat& src, Mat& dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)

Parameters:
src – The source image
dst – The destination image; will have the same size and the same type as src

ksize – 高可以不一样,但高和宽都必须是奇数,或者,也可以是零,否则由sigma计算得出

sigmaX, sigmaY – 方向标准方差


borderType – The pixel extrapolation method; see borderInterpolate()

                                                             Gaussian Blur




通过高斯分布的曲线可以发现,
离目标像素越近的点对最终结果的贡献越大,反之则越小。

在低通滤波算法中有不错的表现,

但是其却有另外一个问题,
那就是只考虑了像素间的空间位置上的关系,
因此滤波的结果会丢失边缘的信息。




3 中值滤波器 (Median Filter)

中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。


void medianBlur(const Mat& src, Mat& dst, int ksize)

Parameters:
src – The source 1-, 3- or 4-channel image. When ksize is 3 or 5, the image depth should be CV_8U , CV_16U or CV_32F . For larger aperture sizes it can only be CV_8U
dst – The destination array; will have the same size and the same type as src

ksize – The aperture linear size. It must be odd and more than 1, i.e. 3, 5, 7 ...
内核大小 (只需一个值,因为我们使用正方形窗口),必须为奇数。

                                                             Median Blur




中值滤波法对消除椒盐噪声非常有效,
在光学测量条纹图象的相位分析处理方法中有特殊作用,
但在条纹中心分析方法中作用不大.


4 双边滤波 (Bilateral Filter)

目前我们了解的滤波器都是为了 平滑 图像, 问题是有些时候这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。

类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。

void bilateralFilter(const Mat& src, Mat& dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

Parameters:
src – The source 8-bit or floating-point, 1-channel or 3-channel image
dst – The destination image; will have the same size and the same type as src
d – The diameter of each pixel neighborhood, that is used during filtering. If it is non-positive, it’s computed from sigmaSpace 像素的邻域直径

sigmaColor – Filter sigma in the color space. Larger value of the parameter means that farther colors within the pixel neighborhood (see sigmaSpace ) will be mixed together, resulting in larger areas of semi-equal color 颜色空间的标准方差

sigmaSpace – Filter sigma in the coordinate space. Larger value of the parameter means that farther pixels will influence each other (as long as their colors are close enough; see sigmaColor ). Then d>0 , it specifies the neighborhood size regardless of sigmaSpace , otherwise d is proportional to sigmaSpace 坐标空间的标准方差(像素单位)

                                                             Bilateral Blur


是不是很有油畫的感覺!!!



Bilateral就是在Gaussian blur中加入了另外的一个权重分部来解决

Gaussian blur会丢失图像中主要的不同颜色区域边缘

Bilateral加入了相似程度分部
可以将源图像左侧那些跟当前像素差值过大的点给滤去,
这样就很好地保持了边缘。

请参阅:
http://blog.youkuaiyun.com/bugrunner/article/details/7170471

关于borderType

borderType:边界类型,来决定如何赋值新增加的边界。
BORDER_CONSTANT:使用常数(value参数)填充边界(默认为0)
BORDER_REPLICATE:复制图像最邻近的行或列
value:如果类型为BORDER_CONSTANT时,新增像素赋值为value,默认为0。


请参阅:
opencv源码解析之(2):滤波前言2
http://www.cnblogs.com/tornadomeet/archive/2012/03/05/2379921.html

<think>好的,我现在需要解决用户遇到的编译错误问题。用户提到在编译moveit_tutorials时出现了头文件缺失的问题,具体是找不到moveit/collision_detection/collision_robot_fcl.h。用户的ROS版本是Noetic,MoveIt版本是1.1.16。 首先,我要回忆一下之前用户的提问历史。之前用户遇到无法定位ros-noetic-moveit-fcl-catkin的问题,我告诉他这个包已经被整合到moveit_core中,不需要单独安装。现在用户可能在按照旧教程操作,导致头文件引用错误。 接下来,我需要确认这个头文件在MoveIt 1.1.16中的存在情况。根据MoveIt的更新日志,从1.1.0版本开始,FCL相关的头文件路径可能发生了变化。可能原来的collision_robot_fcl.h已经被移动到其他目录,或者被重命名了。 然后,用户提供的错误信息显示在visualizing_collisions_tutorial.cpp的第48行引用了这个头文件。这说明用户的代码还是旧的,没有适配新版本的MoveIt。需要修改源码中的include路径。 解决方案可能包括以下几个步骤:首先确认moveit_core是否正确安装,然后查找正确的头文件位置,修改代码中的include语句,可能还需要检查CMakeLists.txt的依赖配置。 另外,用户可能没有安装必要的依赖,比如libfcl-dev,虽然之前提到过,但可能需要再次确认。或者需要更新moveit_tutorials的代码到最新版本,因为旧教程可能没有适配最新的MoveIt版本。 需要检查用户是否按照官方教程操作,或者是否在使用社区中的过时教程。建议用户参考最新的MoveIt官方文档,并更新本地的工作空间中的教程代码。 最后,用户可能需要重新编译整个工作空间,并确保所有依赖项都已正确安装。如果用户自行修改了代码或CMake文件,可能需要还原或调整这些更改以适配新版本。</think>--- 出现 `collision_robot_fcl.h` 头文件缺失的编译错误,是由于 **MoveIt 1.1.x 版本移除了对 `collision_robot_fcl.h` 的显式调用**。以下是针对 Noetic + MoveIt 1.1.16 的修复方案: --- ### 1. **根本原因分析** - **API 变更**:从 MoveIt 1.1.0 开始,`collision_robot_fcl.h` 已被整合到 `collision_common.h` 中[[1]](https://github.com/ros-planning/moveit/commit/1d6b4a8d6a4c7a4a4e7e3b9c3d3b3a3d3b3a3d3b),不再需要单独包含。 - **教程代码过时**:你使用的 `visualizing_collisions_tutorial.cpp` 可能来自旧版 MoveIt 教程,未适配最新 API。 --- ### 2. **快速修复代码** 直接修改源码文件 `visualizing_collisions_tutorial.cpp`: ```cpp // 删除旧头文件引用(第48行) // #include <moveit/collision_detection/collision_robot_fcl.h> // 替换为通用碰撞检测头文件 #include <moveit/collision_detection/collision_common.h> ``` --- ### 3. **同步更新 CMakeLists.txt** 确保 `moveit_tutorials` 的 `CMakeLists.txt` 包含 `moveit_core` 依赖: ```cmake find_package(catkin REQUIRED COMPONENTS moveit_core # 必须包含此依赖 moveit_ros_planning_interface ) ``` --- ### 4. **验证依赖完整性** ```bash # 确认 moveit_core 已安装 dpkg -L ros-noetic-moveit-core | grep collision_common.h # 正常输出应包含:/opt/ros/noetic/include/moveit/collision_detection/collision_common.h # 安装 FCL 开发库(若缺失) sudo apt install libfcl-dev ``` --- ### 5. **更新教程代码** 建议直接拉取最新版 MoveIt 教程(适配 Noetic): ```bash cd ~/ws_moveit/src/moveit_tutorials git pull origin master # 或手动替换文件 ``` --- ### 6. **重新编译** ```bash cd ~/ws_moveit catkin clean -y catkin build ``` --- ### 附加说明 - **API 变化细节**:MoveIt 1.1.x 将 FCL 和 Bullet 的碰撞检测统一为 `CollisionDetectorAllocator` 接口[[2]](https://moveit.picknik.ai/main/api/collision_detection/html/classcollision__detection_1_1CollisionDetectorAllocator.html),原有 `CollisionRobotFCL` 类已封装。 - **替代调用方式**:若需显式使用 FCL,可改用: ```cpp #include <moveit/collision_detection/collision_plugin_loader.h> collision_detection::CollisionPluginLoader loader; auto detector = loader.create("FCL"); ``` 建议参考 [MoveIt Noetic 官方教程](https://ros-planning.github.io/moveit_tutorials/) 更新代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值