opencv-python的简单练习
题目1.读取一张彩色图像并将其转换为灰度图。
import cv2
# 读取图片文件
img = cv2.imread('./1.png')# 将原图灰度化
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片
cv2.imshow('img',img)
cv2.imshow('img_g',img_gray)
# 进行阻塞
cv2.waitKey(0)
题目2:二值化与形态学操作
编写程序,读取一张彩色图像【flower.png】,将其转换为灰度图,然后进行二值化处理。
接着,对二值化后的图像执行腐蚀和膨胀操作,并显示处理前后的图像。
二值化图像
腐蚀图像
膨胀图像
题目3:图像变换与颜色识别
编写程序,读取一张彩色图像,执行以下操作:
- 将图像缩放至指定大小(例如,宽度和高度都缩小为原来的一半)。
- 对缩放后的图像应用仿射变换,实现图像的旋转(例如,旋转45度)。
- 将图像从BGR颜色空间转换为HSV颜色空间,并提取出特定的颜色范围(例如,提取黄色区域)。
- 显示处理后的图像,并在图像上标记出识别到的颜色区域。
import cv2
import numpy as npimg = cv2.imread('./2.png')
img = cv2.resize(img,dsize=None,fx=0.5,fy=0.5)# 获取放射变换矩阵
M =cv2.getRotationMatrix2D(center=(img.shape[1]/2,img.shape[0]/2), # 旋转的中心angle=45, # 旋转的角度scale=0.5) # 缩放 返回一个旋转矩阵img_ro = cv2.warpAffine(img,M,(img.shape[0],img.shape[1]),flags = cv2.INTER_LINEAR, # 插值的方式borderMode=cv2.BORDER_REFLECT_101) # 填充边缘的方式# 将原图转换成hsv
img_hsv = cv2.cvtColor(img_ro,cv2.COLOR_BGR2HSV)
# 制作掩膜
# 选取颜色 这里选择黄色
hsv_min = np.array([26,43,46],dtype=np.float32)
hsv_max = np.array([34,255,255],dtype=np.float32)
mask = cv2.inRange(img_hsv,hsv_min,hsv_max)# 将掩膜与原图进行与运算
img_color = cv2.bitwise_and(img_ro,img_ro,mask=mask)# 利用掩膜识别边缘
c,h =cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#用红线在原图标识
cv2.drawContours(img_ro,c,-1,(0,0,255),2)cv2.imshow('image',img_ro)
cv2.imshow('img_color',img_color)
cv2.waitKey(0)
题目4:图像矫正
编写程序,读取一张彩色图像,执行以下操作
- 找到原图 和目标图的四个点,获取透视变换矩阵
- 对图像应用透视变换,实现油画区域的矫正
import cv2
import numpy as np# 读取图像
img = cv2.imread('./youhua.png')
# 高斯滤波
img_blur = cv2.GaussianBlur(img,(3,3),1)# 灰度化
img_gray = cv2.cvtColor(img_blur,cv2.COLOR_BGR2GRAY)# 二值化
_,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 寻找轮廓
contours,_ = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = sorted(contours,key=cv2.contourArea,reverse=True)[0]
img_copy = img.copy()img_copy = cv2.drawContours(img_copy,[cnt],-1,(0,0,255),2)# 找到card的轮廓 做多边形逼近 获取四个顶点
arc_len = cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,float(0.04)*arc_len,True)
img_draw = img.copy()
# approxpoints1 = np.float32(approx).reshape(-1,2)
print(approx)
points2 = np.float32([[max(points1[:, 0]), min(points1[:, 1])], # 右上角[min(points1[:, 0]), min(points1[:, 1])], # 左上角[min(points1[:, 0]), max(points1[:, 1])], # 左下角[max(points1[:, 0]), max(points1[:, 1])], # 右下角])M = cv2.getPerspectiveTransform(points1,points2)
img_draw = cv2.warpPerspective(img_draw,M,(img.shape[1],img.shape[0]))# 画轮廓# 获取透视变换矩阵
# 进行透视变换# 输出图形
cv2.imshow('img',img)
cv2.imshow('img_copy',img_copy)
cv2.imshow('img_draw',img_draw)
cv2.waitKey(0)
题目5:边缘检测
请编写一段Python代码,使用OpenCV库对一张图像进行以下处理:
- 将图像转换为灰度图。
- 使用高斯滤波器平滑图像,内核大小为5x5,标准差为1。
- 使用Canny边缘检测算法检测图像边缘,阈值1为50,阈值2为150。
- 在检测到的边缘图像上绘制轮廓,轮廓颜色为红色,厚度为2。
import cv2
img = cv2.imread('./picture.png')
# 灰度化
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 高斯滤波
img_blur = cv2.GaussianBlur(img_gray,(5,5),1)
# 边缘检测
img_canny = cv2.Canny(img_blur,50,150)
c,h = cv2.findContours(img_canny,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,c,-1,(0,0,255),2)cv2.imshow('image',img)cv2.imshow('img_canny',img_canny)
cv2.waitKey(0)
题目6:车牌识别预处理
假设你正在开发一个车牌识别系统,首先需要从图像中识别出车牌区域。请描述并编写代码实现以下步骤:
- 读取一张包含车牌的图像。
- 将图像转换为灰度图以简化处理。
- 使用高斯滤波器平滑图像,减少噪声干扰。
- 应用Canny边缘检测算法检测图像中的边缘。
- 查找图像中的轮廓。
- 逐一遍历轮廓。
- 设定一个面积双阈值,只保留面积在该阈值的轮廓。
- 计算这些轮廓的长宽比,长宽比ratio在2到5.5之间的,在原图上用矩形框标出,这些轮廓可能是车牌的候选区域。
import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取车牌图像
img =cv2.imread('./img_1.png')# 转化为单通道图像便于处理
img= cv2.resize(img,dsize=None,fx=0.5,fy=0.5)img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 使用高斯滤波平滑图像,减少噪声干扰
img_blur = cv2.GaussianBlur(img_gray,(5,5),1)# 使用canny检测图像边缘
img_canny =cv2.Canny(img_blur,50,150)# 查找轮廓点集
c,_ = cv2.findContours(img_canny,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓 寻找面积合适的图像
for cnt in c:if cv2.contourArea(cnt)<900 or cv2.contourArea(cnt)>81000000:continueelse:# 计算长宽比arc_len = cv2.arcLength(cnt, # 轮廓True) # 表示轮廓是否闭合approx = cv2.approxPolyDP(cnt, # 轮廓float(0.004) * arc_len, # 这是从原始轮廓到近似多边形的最大距离,决定了逼近精度True # 是否闭合) # 返回逼近多边形的 坐标点集x, y, w, h = cv2.boundingRect(approx)ratio = w / hif 2.0 < ratio < 4.5: # 设定范围减免因图像扭曲产生的误差cv2.rectangle(img,[x, y], # 左上角坐标[x + w, y + h], # 右下角坐标(0, 0, 255), # 矩形颜色2 # 矩形线条粗细)cv2.imshow('img',img)
cv2.imshow('img_b', img_canny)
cv2.waitKey(0)
交通信号灯识别:
你正在开发一个自动驾驶系统,需要识别交通信号灯的颜色(红、黄、绿)。请设计一个简化的流程,说明如何使用OpenCV来识别交通信号灯的颜色。
思路分析:
- 读取包含交通信号灯的图像。
- 转换图像到HSV颜色空间。
- 分别为红、黄、绿三种颜色定义HSV范围,并创建三个掩膜。
- 对每个掩膜进行轮廓检测,识别出可能的信号灯区域。
import cv2
import numpy as np
img = cv2.imread('./demo111.png')# 转化hsv空间
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 红色空间
hsv_min2 = np.array([0,43,46])
hsv_max2 = np.array([10,255,255])
hsv_min1 = np.array([156,43,46])
hsv_max1 = np.array([180,255,255])
mask_1 = cv2.inRange(img_hsv,hsv_min1,hsv_max1)
mask_2 = cv2.inRange(img_hsv,hsv_min2,hsv_max2)
mask_red = cv2.bitwise_or(mask_1,mask_2)
mask_red = cv2.GaussianBlur(mask_red,(3,3),1)
c,_ = cv2.findContours(mask_red,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(c,key=cv2.contourArea,reverse=True)[1]
img = cv2.drawContours(img,[c],-1,(0,0,255),2)# 绿色空间
hsv_min3 = np.array([35,43,46])
hsv_max3 = np.array([99,255,255])
mask_green = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_green = cv2.GaussianBlur(mask_green,(3,3),1)
c,_ = cv2.findContours(mask_green,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(c,key=cv2.contourArea,reverse=True)[0]
img = cv2.drawContours(img,[c],-1,(0,255,0),2)# 黄色空间
hsv_min4 = np.array([11,20,20])
hsv_max4 = np.array([34,255,255])
mask_yellow = cv2.inRange(img_hsv,hsv_min4,hsv_max4)
mask_yellow = cv2.GaussianBlur(mask_yellow,(3,3),1)
c,_ = cv2.findContours(mask_yellow,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(c,key=cv2.contourArea,reverse=True)[0]
img = cv2.drawContours(img,[c],-1,(0,255,255),2)mask = cv2.bitwise_or(mask_red,mask_yellow,mask_green)
img_mask_color = cv2.bitwise_and(img,img,mask=mask)cv2.imshow('image',img)
cv2.imshow('mask',mask)
cv2.imshow('img_mask_color',img_mask_color)cv2.waitKey(0)
在一家生产彩色玩具的工厂中,需要检测产品是否按照正确的颜色进行生产。请设计一个使用OpenCV的自动化检测系统,该系统能够识别并报告不符合颜色标准的产品。
思路分析:
- 设定产品的标准颜色范围(HSV值)。
- 使用摄像头或图像文件获取待检测产品的图像。
- 转换图像到HSV颜色空间。
- 为每种标准颜色创建掩膜,并与产品图像进行比对。
- 识别出颜色不符合标准的产品,并记录或报告。
import cv2
import numpy as np
img = cv2.imread('./duck.png')
img = cv2.resize(img,dsize=None,fx=0.4,fy=0.4)
# 转化hsv空间
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 红色空间
hsv_min2 = np.array([0,43,46])
hsv_max2 = np.array([10,255,255])
hsv_min1 = np.array([156,43,46])
hsv_max1 = np.array([180,255,255])
mask_1 = cv2.inRange(img_hsv,hsv_min1,hsv_max1)
mask_2 = cv2.inRange(img_hsv,hsv_min2,hsv_max2)
mask_red = cv2.bitwise_or(mask_1,mask_2)
mask_red = cv2.GaussianBlur(mask_red,(3,3),1)# 绿色空间
hsv_min3 = np.array([35,43,46])
hsv_max3 = np.array([99,255,255])
mask_green = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_green = cv2.GaussianBlur(mask_green,(3,3),1)# 黑色空间
hsv_min3 = np.array([0,0,40])
hsv_max3 = np.array([180,255,46])
mask_black = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_black = cv2.GaussianBlur(mask_black,(3,3),1)# 蓝色空间
hsv_min3 = np.array([78,43,46])
hsv_max3 = np.array([124,255,255])
mask_blue = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_blue = cv2.GaussianBlur(mask_blue,(3,3),1)mask = cv2.bitwise_or(mask_red,mask_black)
mask1 = cv2.bitwise_or(mask_blue,mask_green)
mask = cv2.bitwise_or(mask1,mask)
mask_color = cv2.bitwise_and(img,img,mask=mask)c,_ = cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)for cnt in c:M = cv2.moments(cnt)if cv2.contourArea(cnt)<700:continueelse:ret = cv2.minAreaRect(cnt)# 调用box获取该外接矩形大的四个顶点box = np.int32(cv2.boxPoints(ret))img = cv2.drawContours(img, [box], -1, (0,255 , 255), 2)# 先计算轮廓形状的中心坐标cX = int(M['m10']/M['m00'])cY = int(M['m01']/M['m00'])# 将识别到的轮廓形状的文字写道轮廓的重点处youhua.pngcv2.putText(img, # 图片'NO', # 要添加的文字字符串(cX,cY), # 要输入文字的坐标cv2.FONT_HERSHEY_SIMPLEX,# 字体类型0.4, # 缩放(0,255,255))cv2.imshow('image',img)
cv2.imshow('mask',mask)
cv2.imshow('img_mask_color',mask_color)cv2.waitKey(0)
图像预处理与特征提取
- 将图像转换为灰度图
- 对灰度图进行二值化处理
- 使用形态学变换去除噪声【开运算】
- 检测图像中的边缘
- 查找并绘制图像中的轮廓
- 逐一遍历轮廓,输出所有四边形的周长 和 面积。
import cv2
import numpy as np# 读取图片
img = cv2.imread('./img_2.png')# 灰度化 二值化
img_gary = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,img_binary = cv2.threshold(img_gary,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 高斯滤波
img_blur = cv2.GaussianBlur(img_binary,(3,3),1)# 开运算消除噪点 腐蚀和膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
img_erode = cv2.erode(img_blur,kernel)
img_dilate = cv2.dilate(img_erode,kernel)# 寻找轮廓
contours,_ = cv2.findContours(img_dilate,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
img_copy = img.copy()# 循环遍历轮廓
for cnt in contours:M = cv2.moments(cnt)if int(M['m00'] )== 0:continueelse:# 排序非常小的轮廓后,寻找与图形相似形状# 把周长的几倍长度的线段作为一条边arc_len = cv2.arcLength(cnt, # 轮廓True) # 表示轮廓是否闭合approx = cv2.approxPolyDP(cnt, # 轮廓float(0.04)*arc_len, #这是从原始轮廓到近似多边形的最大距离,决定了逼近精度True # 是否闭合) # 返回逼近多边形的 坐标点集# 进行形状判断if len(approx) == 4:# 需要进一步判断是正方形还是非正方形x,y,w,h = cv2.boundingRect(approx)ratio = w/hshape = 'rectangle'color = (0,255,0)img_copy = cv2.drawContours(img_copy, contours, -1, (0, 0, 0), 1)str1 = shape+'area:'+str(cv2.contourArea(cnt))str2 = 'len:'+str(cv2.arcLength(cnt,True))# 先计算轮廓形状的中心坐标cX = int(M['m10']/M['m00'])cY = int(M['m01']/M['m00'])# 将识别到的轮廓形状的文字写道轮廓的重点处youhua.pngcv2.putText(img_copy, # 图片str1, # 要添加的文字字符串(cX,cY), # 要输入文字的坐标cv2.FONT_HERSHEY_SIMPLEX,# 字体类型0.4, # 缩放color)cv2.putText(img_copy, # 图片str2, # 要添加的文字字符串(cX, cY+15), # 要输入文字的坐标cv2.FONT_HERSHEY_SIMPLEX, # 字体类型0.4, # 缩放color)# 输出数据
cv2.imshow('image',img)
cv2.imshow('img_copy',img_copy)
cv2.waitKey(0)
相关文章:

opencv-python的简单练习
题目1.读取一张彩色图像并将其转换为灰度图。 import cv2 # 读取图片文件 img cv2.imread(./1.png)# 将原图灰度化 img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片 cv2.imshow(img,img) cv2.imshow(img_g,img_gray) # 进行阻塞 cv2.waitKey(0) 题目2:…...
如何使用生成式AI实现跨领域内容生成
文章目录 引言生成式AI的基本概念定义与分类技术发展现状 跨领域内容生成的技术实现数据准备模型选择与设计训练策略 应用案例分析教育培训新闻媒体文化创意产业 实践建议确定明确的目标构建合适的团队持续迭代改进遵守法律法规 结论 引言 在当今数字化时代,信息的…...
【Linux】socket编程1
socket编程1 1. 网络字节序2. ip地址转换函数3. sockaddr数据结构 1. 网络字节序 多字节数据有大端和小端之分,网络数据流采用大端字节序,如果主机采用的是小端字节序,那么需要转换。 大端:低地址存高字节,高地址存低…...

Linux文件属性 --- 七种文件类型---文件.目录、软硬链接、字符设备文件
目录 七种文件类型 1、普通文件和目录 2、链接文件 2.1硬链接 2.2软链接 3、字符设备文件 一、七种文件类型 Linux的文件属性中一共有以下七种类型 : 符号类型含义解释-普通文件纯文本文件(ASCII)和二进制文件(binaryÿ…...

Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection
论文地址:Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection - ACL Anthologyhttps://aclanthology.org/2024.acl-long.49/ 1. 概述 立场检测被定义为对文本中立场态度的自动推断。根据 Biber 和 Finegan (1988) 的定义,立场包含两个主…...

NextJs 路由管理
NextJs 路由管理 Defining Routes 1. Creating Routes 2. Creating UI export default function Page() {return <h1>Hello, Next.js!</h1> }Route Groups 路由组 1. 在不影响 URL 路径的情况下组织路由 要在不影响 URL 的情况下组织路由,请创建一…...
hive 小文件分析
1、获取fsimage文件: hdfs dfsadmin -fetchImage /data/xy/ 2、从二进制文件解析: hdfs oiv -i /data/xy/fsimage_0000000019891608958 -t /data/xy/tmpdir -o /data/xy/out -p Delimited -delimiter “,” 3、创建hive表 create database if not exists…...
【JavaWeb后端学习笔记】WebSocket通信
WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 主要应用场景:视频弹幕、网页聊天、体育实况更新、股票基金报价实时…...

搭建springmvc项目
什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据,对数据进行处理,…...

Springboot3.x配置类(Configuration)和单元测试
配置类在Spring Boot框架中扮演着关键角色,它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置,取代了早期版本中依赖的XML配置文件。 集中化管理:借助Configuration注解,Spring Boot让用户能在一个或几个配…...

java后端环境配置
因为现在升学了,以前本来想毕业干java的,很多java的环境配置早就忘掉了(比如mysql maven jdk idea),想写个博客记录下来,以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…...

手眼标定工具操作文档
1.手眼标定原理介绍 术语介绍 手眼标定:为了获取相机与机器人坐标系之间得位姿转换关系,需要对相机和机器人坐标系进行标定,该标定过程成为手眼标定,用于存储这一组转换关系的文件称为手眼标定文件。 ETH:即Eye To …...

WebGIS城市停水及影响范围可视化实践
目录 前言 一、相关信息介绍 1、停水信息的来源 2、停水包含的相关信息 二、功能简介 1、基础小区的整理 2、停水计划的管理 三、WebGIS空间可视化 1、使用到的组件 2、停水计划的展示 3、影响小区的展示 4、实际效果 四、总结 前言 城市停水,一个看似…...

无管理员权限 LCU auth-token、port 获取(全网首发 go)
一: 提要: 参考项目: https://github.com/Zzaphkiel/Seraphine 想做一个 lol 查战绩的软件,并且满足自己的需求(把混子和大爹都表示出来),做的第一步就是获取 lcu token ,网上清一色…...

【数字花园】数字花园(个人网站、博客)搭建经历教程
目录 写在最最前面数字花园的定义第一章:netlify免费搭建数字花园相关教程使用的平台步骤信息管理 第二章:本地部署数字花园数字花园网站本地手动部署方案1. 获取网站源码2.2 安装 Node.js 3. 项目部署3.1 安装项目依赖3.2 构建项目3.3 启动http服务器 4…...
python模拟练习第一期
问题一 如果一个数 p 是个质数,同时又是整数 a的约数,则 p 称为 a的一个质因数。 请问 2024 有多少个质因数? 步骤 1: 分解 2024 首先,2024 是偶数,说明可以被 2 整除。我们从 2 开始进行除法分解: 202…...

Xcode
info.plist Appearance Light 关闭黑暗模式 Bundle display name 设置app名称,默认为工程名 Location When In Use Usage Description 定位权限一共有3个key 1.Privacy - Location When In Use Usage Description 2.Privacy - Location Always and When In U…...

RabbitMQ安装延迟消息插件(mq报错)
之前启动一个springboot的单体项目,一直mq的错误,即便我更新了最新版本的mq,还是报错。 后来才发现,项目使用了延时队列,是需要单独下载延时插件的。 1如果判断mq有没有延时队列插件【没有x-delayed-message】 2下载…...
es 3期 第15节-词项查询与跨度查询实战运用
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
iOS Delegate模式
文章目录 一、 Delegate 模式的概念二、Delegate 的实现步骤步骤 1: 定义一个协议(Protocol)步骤 2: 在主类中添加一个 delegate 属性步骤 3: 实现协议的类遵守协议并实现方法步骤 4: 设置 delegate 三、Delegate 模式的特点四、Delegate 模式的常见场景…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...