opencv笔记1

ops/2025/1/19 18:16:09/

openCV是什么?

它的全称是Open source Computer Vision Library,开放源代码计算机视觉库。

后面亚博小车有颜色识别并追踪、人脸识别并追踪实践项目。先了解下基础函数使用。

一 图像的读取与展示

1图像的读取

img = cv2.imread('yahboom.jpg', 0)

第一个参数是图片的路径,第二个参数是如何读取这幅图片。

cv2.IMREAD_UNCHANGED:保持原格式不变,-1;

cv2.IMREAD_GRAYSCALE:以灰度模式读入图片,可以用0表示;

cv2.IMREAD_COLOR:,读入一副彩色图片,可以用1表示;默认值

cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用2表示。

图像展示

cv.imshow('frame', frame):打开一个窗口名为frame,并且显示frame帧数据(图像/视频数据)

参数含义:

第一个参数表示创建打开的窗口的名字

第二个参数表示需要显示的图片

图像的写入

cv2.imwrite('new_img_name', img)

参数含义:

第一个参数是保存的文件名

第二个参数是保存的图像

import cv2 as cv
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv.imread(default_image_path)cv.imwrite("2_new.jpg",img)new_img = cv.imread('2_new.jpg')cv.imshow('frame',img)cv.imshow('new_frame',new_img)cv.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

效果:

2 修改图像颜色

先读取图像,然后修改bgr的数值,示例就是画条线

import cv2 as cv
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv.imread(default_image_path)(b,g,r) = img[100,100]print(b,g,r)i=0j=0for j in range(200,500):img[i,j] =(255,255,0)for j in range(200,500):img[i,j] = (255,255,0)cv.imshow('frame',img)cv.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

二 图片几何变化

 图片缩放

cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)

参数含义:

InputArray src:输入图片

OutputArray ds:输出图片

Size:输出图片尺寸

fx,fy:沿x轴,y轴的缩放系数

interpolation:插入方式,可选择INTER_NEAREST(最近邻插值),INTER_LINEAR(双线性插值(默认设置)),INTER_AREA(使用像素区域关系进行重采样),INTER_CUBIC(4x4像素邻域的双三次插值),INTER_LANCZOS4(8x8像素邻域的Lanczos插值)

import cv2
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv2.imread(default_image_path)self.get_logger().info(f'image shape:{img.shape}')x,y = img.shape[0:2]img_test = cv2.resize(img,(int(x/2),int(y/2)))cv2.imshow('frame',img)cv2.imshow('resize',img_test)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

 图片裁剪

首先读取图像,然后再数组中获取像素点区域。

import cv2
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv2.imread(default_image_path)self.get_logger().info(f'image shape:{img.shape}')cut = img[0:200,200:400]cv2.imshow('frame',img)cv2.imshow('cut',cut)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

图片仿射-平移

cv2.warpAffine 是 OpenCV 中用于执行仿射变换的函数。仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了图像的平直性和平行性。常见的仿射变换包括平移、旋转、缩放和剪切。

cv2.warpAffine(src, M, dsize[,dst[, flags[, borderMode[, borderValue]]]])

参数含义:

src - 输入图像。

M - 变换矩阵。

dsize - 输出图像的大小。

flags - 插值方法的组合(int 类型!)

borderMode - 边界像素模式(int 类型!)

borderValue - (重点!)边界填充值; 默认情况下,它为0。

上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。从数学上看仿射变换是一种二维坐标(x,y)到二维坐标(u,v)之间的线性变换,比如:平移就是加上一个向量。

如果将原始图像src向右侧移动tx、向下移动ty个像素,则其对应关系为:

dst(x, y) = src(x+tx, y+ty)

将上述表达式补充完整,即:

dst(x, y) = src(1·x + 0·y + tx, 0·x + 1·y + ty)

得到转移矩阵:

[[1,0,tx],

[0,1,ty]]

代码如下:

import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv2.imread(default_image_path)self.get_logger().info(f'image shape:{img.shape}')tx,ty = 20,50 #平移距离imgInfo = img.shape# 获取图片尺寸height = imgInfo[0]width = imgInfo[1]#创建平移矩阵:2*3matShift = np.float32([[1, 0, tx], [0, 1, ty]])#应用矩阵shift_img = cv2.warpAffine(img,matShift,(width,height))cv2.imshow('frame',img)cv2.imshow('shift img',shift_img)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

效果:

图片仿射

仿射变化需要一个转换矩阵,复杂的仿射变换需要使用OpenCV 提供的 cv2.getAffineTransform()函数来生成变换矩阵M,M=cv2.getAffineTransform(src, dst)src 和 dst 中的三个点分别对应平行四边形的左上角、右上角、左下角三个点。

这个理解起来比较抽象,我看了下也没太懂,参照例子试一下效果

import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv2.imread(default_image_path)self.get_logger().info(f'image shape:{img.shape}')tx,ty = 20,50 #平移距离imgInfo = img.shape# 获取图片尺寸height = imgInfo[0]width = imgInfo[1]#选择3个点mat_src = np.float32([[0, 0],[0, height-1],[width-1, 0]])  mat_dst = np.float32([[0, 0],[100, height-100],[width-100, 100]]) #创建平移矩阵:2*3matShift = cv2.getAffineTransform(mat_src, mat_dst)#应用矩阵shift_img = cv2.warpAffine(img,matShift,(width,height))cv2.imshow('frame',img)cv2.imshow('shift img',shift_img)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

效果如下:

镜像图片

cv2.flip() 函数的主要功能是实现对图像的翻转操作,可以在水平方向、垂直方向或者两者方向(即对角线翻转)上进行。

import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径class OpenCVNode(Node):def readImg(self,img_name: str):default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_nameself.get_logger().info(f'打开图片:{default_image_path}')img = cv2.imread(default_image_path)self.get_logger().info(f'image shape:{img.shape}')y = cv2.flip(img, 1) #水平翻转 y轴x = cv2.flip(img, 0) #垂直翻转 x轴xy = cv2.flip(img,-1) # xy#应用矩阵cv2.imshow('src',img)cv2.imshow('x 翻转',x)cv2.imshow('y 翻转',y)cv2.imshow('xy 翻转',xy)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('e.jpg') rclpy.spin(node)rclpy.shutdown()

效果如下


http://www.ppmy.cn/ops/151446.html

相关文章

SQL刷题快速入门(三)

其他章节: SQL刷题快速入门(一) SQL刷题快速入门(二) 承接前两个章节,本系列第三章节主要讲SQL中where和having的作用和区别、 GROUP BY和ORDER BY作用和区别、表与表之间的连接操作(重点&…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容,MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令,你需要找到 mysql 可执行文件的路径。 在 macOS 上,mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此,完整的路径应该是&#xff1…

码云gitee 新建仓库 添加公钥

码云gitee 新建仓库 添加公钥 文章目录 码云gitee 新建仓库 添加公钥新建仓库生成公钥管理个人公钥安全验证 码云这个网站是一个代码托管平台,在国内可以无限制的使用,在这个网站上,也可以搜索到一些github上面的内容。进入这个网站&#xff…

Kubernetes集群架构-垃圾回收

Kubernetes集群架构-垃圾回收 Kubernetes 集群架构 - 垃圾回收属主与依赖级联删除前台级联删除后台级联删除被遗弃的依赖对象 未使用容器和镜像的垃圾回收容器镜像生命周期未使用容器镜像的垃圾收集容器垃圾收集 配置垃圾收集 链接 Kubernetes 集群架构 - 垃圾回收 垃圾回收是…

浅谈计算机网络04 | 现代网络需求与技术支撑

现代网络需求与技术支撑 一、网络和因特网流量的类型剖析1.1 弹性流量的自适应特征1.2 非弹性流量的刚性特征1.3 实时流量特性 二、特定领域的网络需求解析2.1 大数据环境下的网络需求分析2.2 云计算环境下的网络需求分析2.3 移动数据环境下的网络需求分析 三、QoS和QoE&#x…

支付宝“政府补贴”bug事件背后的权限管理启示

1月16日,支付宝发生了一起备受关注的“政府补贴”bug事件。在当天14:40-14:45期间,多位用户在使用支付宝进行购物、个人转账、购票、还信用卡等操作时,被提示“政府补贴”,享受到了20%的优惠。这一事件迅速登上微博热搜&#xff0…

Ubuntu -- 几行命令使用Ollama部署本地AI大模型, 仅调用api, 快速测试api效果

需求 需要在本地快速部署一个大模型, 然后使用 局域网 的其他电脑进行 api调用为了快速测试, 大模型选择了 qwen2:0.5B 进行快速测试 开始 下载安装 ollama curl -fsSL https://ollama.com/install.sh | sh验证安装 ollama --version下载安装模型并运行 ollama run qwen2:…

Nginx 集群测试

在 Nginx 集群 的部署和维护过程中,为了确保系统的高可用性、性能和扩展性,必须进行全面的测试。以下是 Nginx 集群需要进行的几类主要测试: 1. 集群有效性测试 集群有效性测试的主要目的是验证 Nginx 集群的基本功能是否正常工作&#xff0…