目录
- 学习opencv过程中一些问题记录
- 学习ROS遇到的问题记录
-
- 头文件和库文件区别
- ROS中CMakeList文件中catkin_package()和find_package()区别和作用
- ROS中CMakeList文件中add_dependencies()和TARGET_LINK_LIBRARIES()区别和作用
- ROS中的CMakeList文件中add_dependencies()中 ¥{¥{PROJECT_NAME}_EXPORTED_TARGETS} 和${catkin_EXPORTED_TARGETS}是什么意思
- catkin中的package.xml和cmakelist文件中依赖项参数含义的解释
- ROS中命名空间的混淆理解
- 二维旋转矩阵的简单通俗理解和记忆
- ROS系统中的TF工具的坐标变换、坐标系变化区别和小乌龟自身坐标系说明
- Cmakelist文件中Install部分的路径变量解释和catkin make install命令说明
- Quaternion(四元数)的tf和msg两种不同的表示方式主要区别和转化方式
学习opencv过程中一些问题记录
为什么opencv分解全彩图像为三个独立的b,g,r通道,但是三个通道的显示都是灰度图像
打开单一通道显示的是灰色的图像,其实不是灰色,是黑白灰三种颜色,打开单一通道时,如果白色越多,证明你打开这个通道颜色越多,比如你打开红色通道,白色代表红色,黑色是红色的相反色。(灰度图像方便人眼观察所以这样设置)
opencv所使用的颜色空间是BGR而不是RGB有什么影响
BGR和RGB区别在于前者的通道数依次是蓝色,绿色和红色,而后者的通道数依次是红绿蓝。使用opencv想可视化出来正常的RGB(也就是真实的图像色彩样式)格式,那么给opencv使用的图像应该是BGR格式的图像,这样颜色的通道数才能一一对应上。详细解释参考链接
opencv中cv::at处理像素时像素坐标的表示应该是(y,x)
因为OpenCV采用了行优先的存储方式,在OpenCV中cv::at表示像素坐标时,应该先指定行数(y 坐标),然后指定列数(x 坐标),也就是处理图像像素坐标为(x,y)时应该用Mat::at(y,x)。具体可参考:OpenCV – 图像遍历的四种方式(at、指针、isCountinuous、迭代器)、在Vector尾部加数据函数push_back() 中的at函数中文解释和这里的实例结果描述。
opencv中cv2.findContours函数解析(补充内外轮廓含义)
参考
内外轮廓含义补充说明:轮廓是闭合的,因此下图所示中1和2都只有一个轮廓(这根粗线的外包围线就是轮廓,包围这个白色部分只需要一个闭合的部分),而0则分内轮廓和外轮廓(这个首尾相接的粗线外部线闭合算作外轮廓,内环线也是闭合的算作内轮廓,包围这个白色部分需要两部分)。
同理分析下图,0和1表示的是这个环的外轮廓和内轮廓,同理2和3也是如此,而7,6,5,4都只有一个外轮廓(5和4可以想象成更粗的一段线因此只包含最外围的环)
学习ROS遇到的问题记录
头文件和库文件区别
头文件本身并不直接指定库函数的位置(也就是头文件中不包含库文件的位置)。头文件只包含了函数的声明,即函数的名称、参数列表和返回类型等信息,以便在编译时进行语法检查和类型检查。
头文件通常用于告知编译器某个函数的存在和接口,但并不提供函数的实际定义和实现。函数的定义和实现通常位于库文件或源代码文件中。
在编译源代码时,编译器需要知道函数的声明,以便验证代码的正确性。但它并不需要知道函数的实现细节或库函数的位置(也就是没有指明头文件位置,编译器会警告,但实际编译过程还是会链接到库文件生成的二进制文件)。
链接器负责在编译后的目标文件与库文件进行链接,将函数的引用与函数的定义进行匹配,以生成最终的可执行文件。链接器可以根据函数的名称和其他信息,从库文件中找到对应的函数定义,并将其与代码中的函数引用进行关联。
因此,头文件的作用是在编译时提供函数的声明,而链接器会处理函数的定义和实现的匹配和链接。头文件本身并不直接指定库函数的位置,而是提供了函数的接口信息,以便编译器和链接器能够正确处理函数的引用和链接。
具体细节参考此处
ROS中CMakeList文件中catkin_package()和find_package()区别和作用
catkin_packge()官方说明文档:详细文档
上图官方文档部分内容则是了下文黄色字体含义。
这部分内容说明很多catkin类的初始化变量,例如¥{catkin_INCLUDE_DIRS}和${catkin_EXPORTED_TARGETS}等,是catkin_package()运行才定义的,所以Cmakelist文件中catkin_package()一定是非注释的即使其内部参数设置都是注释状态。
cmake_minimum_required(VERSION 3.0.2)
project(your_package_name)
find_package(catkin REQUIRED)
catkin_package()
//上述命令在cmakelist文件夹中一般是不能够缺少的!
当然,如果catkin_package()中指定了catkindepence项,则记得修改package.xml文件中的 <build_export_depend>。。。</build_export_depend>部分内容添加上这些项!参考下图部分内容
find_package()可以帮助我们实现该功能包找头文件和库的目的,而catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息,其主要用途如果其他功能包使用本功能包(有catkin_package()设置的包)的话,其他功能包会包含我们在本功能包catkin_package中声明的include路径和库,对于DEPENDS依赖项,会将DEPENDS的头文件路径和库添加到本功能包下的include路径和库,也能让其他功能包使用。(对强调部分内容的简单理解可以看这里)但是,如果其他功能包明确需要使用某些依赖,还是需要再find_package()中标注避免一些报错。
catkin_package()参数:
INCLUDE_DIRS:声明给其它package的include路径
LIBRARIES: 声明给其它package的库
CATKIN_DEPENDS: 该功能包被使用时且需要导出提供给其他功能包调用的catkin package
DEPENDS: 该功能包被使用时且需要导出给其他功能包调用的非catkin package
详细讲解请看该参考文献,下面对其内容一些笔记如下:
笔记:这句话是说这两个选项是告诉catkin需要将该程序包的哪些依赖项传递给其他调用你该程序包的程序包来使用。
笔记:这段文字主要解释了catkin_package中INCLUDE_DIRS和LIBRARIES选项的意义。
笔记:这段文字强调了如果其他功能包明确需要使用某些依赖,还是需要再find_package()中标注避免一些报错。
笔记:这段文字将catkin依赖单独设置一个CATKIN_DEPENDS选项是为了让catkin执行一些额外的检查,确定依赖项是catkin依赖项而不是其他库中的依赖项。
简单理解请看这个参考文献
ROS中CMakeList文件中add_dependencies()和TARGET_LINK_LIBRARIES()区别和作用
add_dependencies()是确保TARGET_LINK_LIBRARIES()进行链接过程中依赖性都已经提前编译生成可执行程序。add_dependencies()一般用于对自定义的Messages, Services, and Action Targets提前编译生成可执行程序。
具体解释参考这里
ROS中的CMakeList文件中add_dependencies()中 ¥{¥{PROJECT_NAME}_EXPORTED_TARGETS} 和${catkin_EXPORTED_TARGETS}是什么意思
首先CMakeList文件中的project()定义了功能包名称,可以使用变量