OpenCV学习之旅:图像的几何变换
仿射变换
仿射变换是指图像可以通过一系列几何变换来实现平移、缩放、旋转等操作。OpenCV中为仿射变换提供的仿射函数为cv2.warpAffine(),可以通过一个映射矩阵M来实现这种变换。其中,M具体可为:
\[
{\rm dst}(x, y) = {\rm src}(M_{11}x + M_{12}y + M_{13}, M_{21}x +
M_{22}y + M_{23})
\]
一般格式:
1dst = cv2.warpAffine(src, M,dsize[, flags[, borderMode[, borderValue]]])
dst表示仿射后的输出图像,类型与原始图像相同。
src表示要仿射的原始图像。
M表示变换矩阵。
dsize表示输出图像尺寸的大小。
flags表示插值方法,默认INTER_LIEAR。
borderMode表示边类型,默认BORDER_CONSTANT。
borderValue表示边界值,默认为0。
平移
平移是对象位置的移动。如果我们想要将\((x,y)\) 偏移至并\((tx,t_y)\),我们可以创 ...
OpenCV学习之旅:图像的色彩空间转换
RGB图像是一种比较常见的色彩空间类型,除此之外,还有一些其他的色彩空间,例如GRAY色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间等。每个色彩空间都有自己擅长的处理问题的领域,因此,为了更方便地处理某个具体问题,就要用到色彩空间类型的转换。色彩空间类型转换是指将图像从一个色彩空间转换到另外一个色彩空间。
色彩空间类型转换函数
在OpenCV中,cv2.cvtColor()函数用于实现色彩空间转换,其一般格式为:
1dst = cv2.cvtColor(src, code [, dstCn])
dst表示与输入值具有相同类型和深度的输出图像。
src表示原始输入图像。
code是色彩空间转换码,常见的枚举值如表3-6所示。
dstCn表示目标图像的通道数。
常用色彩空间转换码:
转换码
解释
cv2.cvtColor_BGR2RGB
BGR色彩空间转RGB色彩空间
cv2.cvtColor_BGR2GRAY
BGR色彩空间转GRAY色彩空间
cv2.cvtColor_BGR2HSV
BGR ...
OpenCV学习之旅:图像运算
初识numpy.array
在OpenCV中,很多Python
API是基于Numpy的,Numpy是Python的一种开源的数值计算扩展,用来处理多维数组。
使用Numpy生成一个灰度图像,其中的像素均为随机数。代码如下:
12345678import cv2 as cvimport numpy as np# 生成一个随机灰度图imagegray = np.random.randint(0,256,size=[256,256],dtype=np.uint8)cv.imshow("imagegray",imagegray)cv.waitKey()cv.destroyAllWindows()
效果如下:
屏幕截图 2025-01-19
182856.png
加法运算
在面向Python的OpenCV中有两种方法可以实现图像的加法运算。一种是通过运算符“+”对图像进行加法运算,另一种是通过cv2.add()函数来实现对图像的加法运算。
因为计算机一般使用8个比特来表示灰度图像,所以像素值的范围是0~255。当像素值的和超过255时,这两种 ...
挂拆接地线项目学习研究:PCB设计概述
印制电路板剖析
在印制电路板(PCB)设计中,“层”具有特殊的重要性。所以电路板通常划分为三类:单面板、双面板和多层板。
需要电源的元件称为有源元件,比如晶体管和集成电路IC。相应地,不需要电源的元件称为无源元件,比如电阻和电容。
电路板的作用:
为一组元件提供机械支撑。元件与电路板相接的位置称为焊盘,我们使用被称为走线的铜线对焊盘进行连接。
提供元件之间的电气连接。这需要使用导电金属来对焊盘进行连接。电路板使用称为走线(trace)的导电线来实现这些连接。为电路板布设这些走线的过程称为布线(routing),是电路设计过程的关键部分。
理论上,电路板设计相当简单:只要画出元件焊盘的位置并把它们连接在一起。但是在实践中,这个过程有大量的细节需要考虑。走线宽度应设定为多少?金属部分的密集程度是否适当?元件A应当置于顶面还是底面?元件X的焊盘1、3、5、7怎样以最佳方式连接到元件Y的焊盘2、4、6、8上?
电路板设计者的工作通常不会涉及PCB制造过程。我们的工作是为制造厂家提供把我们的设计变成实物时所需要的信息。这些信息由以下三部分组成:
位置
(Locati ...
挂拆接地线项目学习研究:元器件的使用
ESP32 DEVKIT V1
ESP32-DevKit-V1-Pinout-Diagram-r0.1-CIRCUITSTATE-Electronics-2.png
(4800×3360)
ESP32 DEVKIT
V1是一款多功能开发板,可充分利用ESP32微控制器的强大功能。该芯片集成了WiFi
和蓝牙功能,是物联网 (IoT) 项目的理想选择。该板的 30 个 GPIO
引脚提供广泛的功能,从数字和模拟I/O到触摸传感器、SPI、I2C和UART通信。
引脚
功能
VIN
3.3V正电压稳压器的输入。供电电压范围为4V至12V。
3.3V
来自电压稳压器的输出。如果有3.3V电源,也可以将其连接到该引脚。但不要同时向VIN和3V3提供。
ASL43L
4路0.06mA低功耗免编程接收模块。
引脚
功能
ANT
天线脚
KEY
接对码按键
D0~D3
4路开关量输出,D0(TX)在串口模式时为串口输出
XT ...
ROS入门之旅:动作(action)
内容参考自Programming Robots with ROS by Morgan Quiley,
Brian Gerkey, and William D. Smart (O'Reily). Copyright 2015 Morgan
Quiley, Brian Gerkey, and William D. Smart, 978-1-4493-2389-9
ROS的动作机制非常适合作为时间不确定,目标导向型的操作的接口,比如goto_position。服务机制是同步的,而动作机制则是异步的。与服务的诸求/响应结构类似,动作使用目标来启动一次操作,在操作完成后会发送一个结果。在此基础上,动作引入了反馈来提供操作的进度信息,
还支持取消当前进行中的操作。从原理上看,动作使用话题实现,其本质上相当于一个规定了一系列话题(目标、结果、反馈等)的组合使用方法的高层协议。
改用动作接口实现goto_position,整个控制流程就会变成这样:首先还是发送一个目标,然后就可以转去做其他工作了。在操作的执行过程中,会周期性收到执行进度的消息(已经移动的距离、预计完成时间等),直到操 ...
ROS入门之旅:服务(service)
内容参考自Programming Robots with ROS by Morgan Quiley,
Brian Gerkey, and William D. Smart (O'Reily). Copyright 2015 Morgan
Quiley, Brian Gerkey, and William D. Smart, 978-1-4493-2389-9
服务 (service)
是另一种在节点之间传递数据的方法。服务其实就是同步的跨进程函数调用;它们能够让一个节点调用运行在另一个节点中的函数。我们就像之前定义消息类型一样定义这个函数的输人/输出。服务端(提供服务的节点)定义了一个回调函数来处理服务请求,并声明这个服务。客户端(进行服务请求的节点)通过一个本地的代理调用这个服务。
服务调用非常适用于那些只需要偶尔去做并且会在有限时间里完成的事情。我们想要分发到其他计算机上去做的通用计算就是一个很好的例子。机器人可能偶尔发生的一些行为,比如打开传感器或从摄像机获取一张高分辨率的图像,也可以考虑用服务来实现。
定义服务
我们的例子使用了计算字符串中的单词的个数的。 ...
ROS入门之旅:话题(topic)
内容参考自Programming Robots with ROS by Morgan Quiley,
Brian Gerkey, and William D. Smart (O'Reily). Copyright 2015 Morgan
Quiley, Brian Gerkey, and William D. Smart, 978-1-4493-2389-9
将消息发布到话题上
创建话题
如下是声明一个话题并在其上发布消息的基本代码。这个节点以2Hz的速率发送连续的整数到counter节点上。
topic_publisher.py:
12345678910111213#!/usr/bin/env pythonimport rospyfrom std_msgs.msg import Int32rospy.init_node('topic_publisher')pub = rospy.Publisher('counter', Int32)rate = rospy.Rate(2)count = 0while not rospy.i ...
ROS入门之旅:ROS初步
内容参考自Programming Robots with ROS by Morgan Quiley,
Brian Gerkey, and William D. Smart (O'Reily). Copyright 2015 Morgan
Quiley, Brian Gerkey, and William D. Smart, 978-1-4493-2389-9
ROS的安装
我是用的是Linux ubuntu 16.04(在VMWare 17上运行),安装的是ROS
Kinetic。
ROS的安装复杂而繁琐,我也是经过了许久的尝试。可参考以下文档:
https://robot.czxy.com/docs/ros/env/ros16/
创建工作区(workspace)
创建一个catkin工作区并初始化:
123mkdir -p ~/catkin_ws/srccd ~/catkin_ws/srccatkin_init_workspace
以上命令创建了一个叫做catkin_ws的工作区路径(工作区的名字可以是任意的),其中包含了一个src路径。
接下 ...
Linux命令行学习笔记:命令的重新运行
查看历史命令
使用shell内置的history命令可以查看我们在交互式shell中执行的命令。history输出的结果可能是成百上千行,在history后加上整数可以将输出限制在最新几行:
1history 3
12334 ls never_delete_wrong_file_135 history36 history 3
history向stdout中输出,因此我们可以用管道处理。
在当前shell中清楚(删除)历史,可以用-c选项:
1history -c
从历史中重新召唤命令
三种从shell历史记录中回忆命令的节省时间的方法:
光标移动
极其容易学习,但在实践中往往速度较慢
历史展开
学习起来较难(坦白说,它很晦涩难懂),但可以非常快
增量搜索
既简单又快速
光标移动
按上/下箭头选择历史命令。
历史展开
历史展开是一个通过特殊表达式获取历史命令的shell特性。表达式以感叹号(读作"bang")开头。例如,一行中的两个感叹号("bang
bang")执行紧接着的前一个命令。
1ignoreboth ...
