当前位置: 首页 > news >正文

opencv笔记2

 图像灰度

彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有256*256*256变化。而灰度图像是R,G,B三个分量相同的一种特殊的彩色图像,其中一个像素点的变化范围为256种。灰度图像的描述与彩色图像一样仍然反映了整副图像的整体和局部的色度和高亮等级的分布和特征。

在OpenCV中,用cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)来实现对图像进行灰度化处理。

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}')#灰度gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow('src',img)cv2.imshow('gray',gray)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('2.jpg') rclpy.spin(node)rclpy.shutdown()

效果

OpenCV图像二值化处理

给定阈值,大于阈值的为0(黑色)或 255(白色),使图像称为黑白图。阈值可固定,也可以自适应阈值。自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较。

cv2.threshold(src, threshold, maxValue, thresholdType)

参数含义:

src:原图像

threshold:当前阈值

maxVal:最大阈值,一般为255

thresholdType:阈值类型

  • cv.THRESH_BINARY
  • cv.THRESH_BINARY_INV
  • cv.THRESH_TRUNC
  • cv.THRESH_TOZERO
  • cv.THRESH_TOZERO_INV

返回值:

retval:与参数thresh一致

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}')src = cv2.imread(default_image_path)#灰度img = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)cv2.imshow('gray',img)cv2.imshow('BINARY',thresh1)cv2.imshow('BINARY_INV',thresh2)cv2.imshow('TRUNC',thresh3)cv2.imshow('TOZERO',thresh4)cv2.imshow('TOZERO_INV',thresh5)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('1.jpg') rclpy.spin(node)rclpy.shutdown()

效果如下

图像边缘检测

边缘检测是识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测对于分析图像中的内容、实现图像中物体的分割、定位等具有重要的作用。边缘检测大大减少了源图像的数据量,显著减少图像的数据规模。主要是从数学角度去分类,简单了解下背景:如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,函数值的变化趋势可以用函数的导数描述,图像的边缘对应在灰度值函数中是函数值突然变大的区域,进而确定图像中的边缘位置。

分类如下:

一阶导数的边缘检测算子:通过计算图像的梯度值来检测图像的边缘,常见的有Roberts算子、Sobel算子和Prewitt算子。

二阶导数的边缘算子:通过寻求二阶导数中的过零点来检测边缘,,常见的有Laplacian 算子,此类算子对噪声敏感。

其他边缘算子:前面两类均是通过微分算子来检测图像边缘,还有一种就是Canny算子,其是在满足一定约束条件下推导出来的边缘检测最优化算子。

目前有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。

Canny算子的简要步骤如下:

(1)去噪声:应用高斯滤波来平滑图像,目的是去除噪声

(2)梯度:找寻图像的梯度

(3)非极大值抑制:应用非最大抑制技术来过滤掉非边缘像素,将模糊的边界变得清晰。该过程保留了每个像素点上梯度强度的极大值,过滤掉其他的值。

(4)应用双阈值的方法来区分强边缘和弱边缘

(5)利用滞后技术来跟踪边界。若某一像素位置和强边界相连的弱边界认为是边界,其他的弱边界则被删除。

背后有很多数学推导过程,网上很多大佬写文章介绍,还有很多深度展开调整参数的。
https://blog.csdn.net/zaishuiyifangxym/article/details/90142702

https://zhuanlan.zhihu.com/p/447565904

https://zhuanlan.zhihu.com/p/99959996

看下OpenCV里面,canny算法的实现步骤

.Canny方法处理得到图像:edges=cv2.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])

参数含义:

edges:计算得到的边缘图像

image :计算得到的边缘图像,一般是高斯处理后得到的图像

threshold1 :处理过程中的第一个阈值

threshold2 :处理过程中的第二个阈值

apertureSize :Sobel 算子的孔径大小

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)#灰度gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#高斯降噪gaussian = cv2.GaussianBlur(gray, (5, 5), 0)# Canny算子Canny50 = cv2.Canny(gaussian, 50, 50)Canny100 = cv2.Canny(gaussian, 50, 100)Canny150 = cv2.Canny(gaussian, 50, 150)#cv2.imshow('gray',gray)cv2.imshow('Canny50',Canny50)cv2.imshow('Canny100',Canny100)cv2.imshow('Canny150',Canny150)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('e.jpg') rclpy.spin(node)rclpy.shutdown()

通过调整canny参数,可见效果不同,第二个阈值越大,图片丢失细节越多。

OpenCV绘制图形

划线

cv2.line(dst,pt1,pt2,color,thickness=None,lineType=None,shift=None)函数进行线段的绘制。

参数含义:

dst:输出图像。

pt1,pt2:必选参数。线段的坐标点,分别表示起始点和终止点

color:必选参数。用于设置线段的颜色

thickness:可选参数。用于设置线段的宽度

lineType:可选参数。用于设置线段的类型,可选8(8邻接连接线-默认)、4(4邻接连接线)和cv2.LINE_AA 为抗锯齿

画矩形

cv2.rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)

参数含义:

img:画布或者载体图像

pt1,pt2:必选参数。矩形的顶点,分别表示顶点与对角顶点,即矩形的左上角与右下角(这两个顶点可以确定一个唯一的矩形),可以理解成是对角线。

color:必选参数。用于设置矩形的颜色

 

画圆

cv2.circle(img, center, radius, color[,thickness[,lineType]])

参数含义:

img:画或者载体图像布

center:为圆心坐标,格式: (50,50)

radius:半径

thickness: 线条粗细。默认为1.如果-1则为填充实心

lineType:线条类型。

画椭圆

cv2.ellipse(img, center, axes, angle, StartAngle, endAngle, color[,thickness[,lineType]

参数含义:

center:椭圆的中心点,(x,y)

axes:指的是短半径和长半径,(x,y)

StartAngle:圆弧起始角的角度

endAngle:圆弧终结角的角度

画多边形

cv2.polylines(img,[pts],isClosed, color[,thickness[,lineType]])

参数含义:

pts:多边形的顶点

isClosed:是否闭合。(True/False)

文字

cv2.putText(img, str, origin, font, size,color,thickness)

参数含义:

img:输入图像

str:绘制的文字

origin:左上角坐标(整数),可以理解成文字是从哪里开始的

font:字体

size:字体大小

color:字体颜色

thickness:字体粗细

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)#划线line = cv2.line(img, (50,20), (20,100), (255,0,255), 10)#画矩形rect = cv2.rectangle(img, (110,50), (200,200), (255,0,255), 10)#画圆circle = cv2.circle(img, (280,120), 50, (255,0,255), 10)#画椭圆ellipse = cv2.ellipse(img, (400,120), (20,50),0,0, 360,(255,0,255), 5)# textcv2.putText(img,'bohu text test',(50,550),cv2.FONT_HERSHEY_SIMPLEX,1,(0,200,0),2)#多边形points = np.array([[120,250], [340,440], [350,410], [250,250]], np.int32)cv2.polylines(img, [points],True,(255,0,255), 5)cv2.imshow('gray',img)cv2.waitKey(0)def main():rclpy.init()node = OpenCVNode('opencvNode')node.readImg('e.jpg') rclpy.spin(node)rclpy.shutdown()

 

相关文章:

opencv笔记2

图像灰度 彩色图像转化为灰度图像的过程是图像的灰度化处理。彩色图像中的每个像素的颜色由R,G,B三个分量决定,而每个分量中可取值0-255,这样一个像素点可以有256*256*256变化。而灰度图像是R,G,B三个分量…...

springboot使用ssl连接elasticsearch

使用es时ssl证书报错 unable to find valid certification path to requested target 1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>2…...

Linux内核中的InfiniBand核心驱动:verbs.c分析

InfiniBand(IB)是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)、数据中心和云计算等领域。Linux内核中的InfiniBand子系统通过提供一组核心API(称为Verbs API)来支持InfiniBand设备的操作。drivers/infiniband/core/verbs.c是InfiniBand核心驱动的重要组…...

把网站程序数据上传到服务器的方法和注意事项

将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法&#xff1a; 使用FTP&#xff1a; 1. 选择FTP客户端软件&#xff1a; - 常见的FTP客户端包括FileZilla(开源)、…...

完全平方数——唯一分解定理

文章目录 一、唯一分解定理是什么&#xff1f;1.定义2.示例3.代码模板 二、例题1>问题描述&#xff08;2021蓝桥杯省赛&#xff09;输入格式输出格式样例输入 1样例输出 1样例输入 2样例输出 2评测用例规模与约定 2>解题思路3>假娃3>C嘎嘎 一、唯一分解定理是什么&…...

(详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源

文章目录 Springboot 整合多动态数据源 这里有mysql&#xff08;分为master 和 slave&#xff09; 和oracle1. 引入相关的依赖2. 创建相关配置文件3. 在相关目录下进行编码&#xff0c;不同路径会使用不同数据源 Springboot 整合多动态数据源 这里有mysql&#xff08;分为maste…...

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…...

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…...

鸿蒙Harmony json转对象(1)

案例1 运行代码如下 上图的运行结果如下: 附加1 Json_msg interface 案例2 import {JSON } from kit.ArkTS; export interface commonRes {status: numberreturnJSON: ESObject;time: string } export interface returnRes {uid: stringuserType: number; }Entry Component …...

常见的RocketMQ面试题及其简要答案

以下是一些常见的RocketMQ面试题及其简要答案&#xff1a; 一、基础概念与架构 简述RocketMQ是什么&#xff0c;并说明其主要作用。 答案&#xff1a; RocketMQ&#xff1a;是阿里巴巴在2012年开源的一款分布式消息中间件&#xff0c;目前已经捐赠给Apache软件基金会&#xff…...

C#Object类型的索引,序列化和反序列化

前言 最近在编写一篇关于标准Mes接口框架的文章。其中有一个非常需要考究的内容时如果实现数据灵活和可使用性强。因为考虑数据灵活性&#xff0c;所以我一开始选取了Object类型作为数据类型&#xff0c;Object作为数据Value字段&#xff0c;String作为数据Key字段&#xff0c…...

Unity3D项目开发中的资源加密详解

前言 在Unity3D游戏开发中&#xff0c;保护游戏资源不被非法获取和篡改是至关重要的一环。资源加密作为一种有效的技术手段&#xff0c;可以帮助开发者维护游戏的知识产权和安全性。本文将详细介绍Unity3D项目中如何进行资源加密&#xff0c;并提供相应的技术详解和代码实现。…...

微调Qwen2:7B模型,加入未知信息语料

对于QWen2这样的模型,在微调的时候,语料的投喂格式满足ChatML这样的格式!!! OpenAI - ChatML: 下面是ChatML格式的介绍: https://github.com/openai/openai-python/blob/release-v0.28.0/chatml.mdhttps://github.com/openai/openai-python/blob/release-v0.28.0/chat…...

【Ubuntu】安装SSH启用远程连接

【Ubuntu】安装OpenSSH启用远程连接 零、安装软件 使用如下代码安装OpenSSH服务端&#xff1a; sudo apt install openssh-server壹、启动服务 使用如下代码启动OpenSSH服务端&#xff1a; sudo systemctl start ssh贰、配置SSH&#xff08;可跳过&#xff09; 配置文件 …...

【理论】测试开发工程师进阶路线

一、腾讯与阿里的质量保证服务参考 阿里云效测试能力与架构 腾讯 WeTest 测试能力全景图 二、测试开发技术体系 1.用户端测试&#xff1a; Web/App 测试 Web/App 自动化测试 用户端专项测试 用户端安全测试 2.服务端测试&#xff1a; 接口协议与 Mock 接口自动化测试 服务端…...

【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证

引言 前面已经对BQ3568HM开发板进行了初步测试&#xff0c;后面我要实现MQTT的工作&#xff0c;但是遇到一个问题&#xff0c;就是开发板无法通过校园网的认证操作。未认证的话会&#xff0c;学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...

動態住宅IP提升網站訪問成功率

動態住宅IP通常與普通家庭用戶的網路連接相關聯。這種IP地址的特點在於&#xff0c;它是動態變化的&#xff0c;用戶在每次連接時可能會獲得不同的IP地址。這與靜態IP形成了鮮明對比&#xff0c;後者在連接期間保持不變。傳統上&#xff0c;IP地址分為住宅IP和數據中心IP兩類。…...

2024年博客之星主题创作|2024年蓝桥杯与数学建模年度总结与心得

引言 2024年&#xff0c;我在蓝桥杯编程竞赛和数学建模竞赛中投入了大量时间和精力&#xff0c;这两项活动不仅加深了我对算法、数据结构、数学建模方法的理解&#xff0c;还提升了我的解决实际问题的能力。从蓝桥杯的算法挑战到数学建模的复杂应用&#xff0c;我在这些竞赛中…...

Spring Boot/MVC

一、Spring Boot的创建 1.Spring Boot简化Spring程序的开发,使用注解和配置的方式开发 springboot内置了tomact服务器 tomact:web服务器,默认端口号8080,所以访问程序使用8080 src/main/java:Java源代码 src/main/resource:静态资源或配置文件,存放前端代码(js,css,html) s…...

由于请求的竞态问题,前端仔喜提了一个bug

在平常的开发过程中&#xff0c;你可能会遇到这样一个bug。 测试&#xff1a;我在测一个输入框搜索的功能时&#xff0c;告诉你通过输入框输入的内容&#xff0c;和最终通过输入内容搜索出来的结果对不上。 前端&#xff1a;我是通过调用后端接口拿到的数据&#xff0c;这明显…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...