day26图像处理OpenCV

文章目录

一、OpenCV

1.介绍

  • OpenCV(开放源代码计算机视觉库)是一个开源的计算机视觉和机器学习软件库。由一系列 C++ 类和函数构成,用于图像处理、计算机视觉领域的算法实现。

  • OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。

2.下载

python 复制代码
x pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

3.图像的表示

  • 图像一般是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的;在OpenCV中,默认情况下,彩色图像是以BGR(蓝-绿-红)顺序存储
  • 彩色图像:三维数组存储【行数,列数,通道数(一般是3)】
  • 灰色图像:二维存储【行数,列数】
  • 数组存储的数据类型(dtype):图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。

4.图像的基本操作

4.1图片读取或创建

4.1.1读取
  • cv2.imread(filename)
  • 参数:
    • filename:图像路径
4.1.2创建
python 复制代码
import cv2
import numpy as np

# 设置图像尺寸
height, width = 512, 512
# 创建一个空白的彩色图像-----三维数组,8位
img = np.zeros((height, width, 3), dtype=np.uint8)
# 修改像素值-----0~255的随机整数,大小相同的数组
img[::] = np.random.randint(0, 256, img.shape)

# 设置显示的图像---z'd
cv2.imshow('Random Color Image', img)
# 显示时间
cv2.waitKey(0)
# 释放内存
cv2.destroyAllWindows()

4.2创建窗口

用于显示图片。不创建也可以,在显示的时候可以自动创建。

  • cv2.namedWindow(winname [,窗口属性])

  • 使用 cv2.namedWindow() 方法创建一个新的窗口。你可以为这个窗口指定一个名称,并且可以选择窗口的属性(例如,是否可调整大小)。

  • 参数:

  • winname:窗口名

  • 窗口属性:窗口大小是否可调整

    • cv2.WINDOW_AUTOSIZE:默认,窗口自适应大小,不能调整
    • cv2.WINDOW_NORMAL:窗口大小是可调整的,用户可以通过鼠标拖动窗口边缘来自由改变窗口大小。

4.3显示图片

4.3.1设置读取的图片

cv2.imshow(winname,img)

参数:

  • winname:显示图像的窗口名,以字符串类型表示
  • img:要显示的图像

注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。

4.3.2设置显示多久

cv.waitKey(n):

  • n = 0:一直显示

  • n > 0:显示 n毫秒

4.3.3释放

在关闭图像后执行

  • cv2.destroyAllWindows():立即销毁所有(打开的)窗口
  • cv2.destroyWindow(winname):关闭指定名称的窗口。省略则销毁所有已打开的窗口。

4.4.保存图片

cv2.imwrite(path,img)

参数:

  • path:图片保存的路径和图片名
  • img:要保存的图像

4.5图片切片(剪裁)

从图像中提取一个子区域(矩形区域)。

读取到的图片是一个numpy.ndarray类型的数组,所以可以直接切片操作

  • img[y:y+h,x:x+w]提取的是从(x,y)开始,高度为h,宽度为w的矩形区域

示例:

python 复制代码
import numpy as np
import cv2 as cv
# 读取图像
img=cv.imread("images/001.jpg")
print(img.shape)
# 定义剪裁后图像的宽度和高度(以像素为单位)
h = 300
w = 500
# 定义剪裁的起始点,坐标小于图片的宽高
y=100
x=200
# 剪裁
img2=img[y:y+h,x:x+w]
print(img2.shape)

4.6图片大小调节

  • cv2.resize是Opencv库中用于调整图像大小的函数,在图像处理中很常用,特别是在要对图像进行缩放以适应不同需求时。
  • cv2.resize(img,dsize)
    • img:输入图像,通常是二维或三位NumPy数组。
    • dsize:输出图像的尺寸,是一个二元组(w,h)
  • 示例:
python 复制代码
import cv2 as cv
# 读取图片
img=cv.imread("images/001.jpg")
print(img.shape)
# 调整的大小
dsize=(100,200)
new_img=cv.resize(img,dsize)
print(new_img.shape)

5.在图像中绘值

5.1绘制直线

  • cv2.line(img,sart,end,color,thickness)

  • 参数

    • img:要绘制直线的图像
    • start、end:直线的起点和终点坐标
    • color:直线的颜色(对于彩色图像,使用 BGR 格式指定颜色)
    • thickness:线条宽度

5.2绘制圆形

  • cv2.circle(img,centerpoint,r,color,thickness,cv.LINE_AA)

  • 参数:

    • img:要绘制圆形的图片
    • centerpoint、r:圆心坐标和半径
    • color:线条颜色
    • tnickness:线条宽度,为-1时完全填充颜色
    • cv.LINE_AA: 反走样技术,让图行边缘更光滑

5.3绘制矩形

  • cv2.rectangle(img,leftupper,rightdown,color,thickness)

  • 参数:

    • img:要绘制矩形的图像
    • leftupper、rightdown:矩形的左上角和右下角坐标
    • color:线条的颜色
    • thickness:线条的宽度

5.4添加文字

  • cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)

  • 参数:

    • img:要添加文字的图像
    • text:要写入的文本数据
    • station:文本的放置位置
    • font:字体样式
    • Fontscale:字体大小
    • thickness:字体线条宽度
    • cv2.LINE_AA: 反走样技术,让图行边缘更光滑

5.5综合案例

python 复制代码
import cv2 as cv
# 读取图片
img = cv.imread("./imgs/cat1.png")
# 绘制直线---起点,终点,颜色,粗细
cv.line(img, [100,100], [400, 400], [0, 0, 255], 2)
# 绘制圆形---圆心,半径,颜色,粗细,抗锯齿(平滑)
cv.circle(img, [300, 300], 50, [0, 255, 0], 2,cv.LINE_AA)
# 绘制矩形---左上角,右下角,颜色,粗细,抗锯齿(平滑)
cv.rectangle(img, [100, 100], [400, 400], [255, 0, 0], 2, cv.LINE_AA)
# 绘制文字---文字内容,哪里开始写,字体类型,字体大小,颜色,字体粗细
cv.putText(img, "Hello World!",(450,450), cv.FONT_ITALIC, 1, [255, 0, 0], 2)

cv.imshow("Cat", img)
cv.waitKey(0)
cv.destroyAllWindows()

6.读取视频

  • cap = cv2.VideoCapture(path)

    • path:视频流资源路径设置为;填0,代表从默认摄像头捕获视频流(自拍)
  • ret,frame = cap.read()

  • 返回值cap调用read()方法得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。

示例:

python 复制代码
import cv2 as cv
# 创建VideoCapture对象,参数为摄像头索引(通常为0,如果为单一摄像头)
vi=cv.VideoCapture(0)
while True:
    ret,frame=vi.read()
    if not ret:
        print("error")
        break
    cv.imshow("frame",frame)
    # 等待40毫秒并检查按键事件,获取按键的ASCII码,判断按键是否为q键
    if cv.waitKey(40) & 0xFF==ord('q'):
        break
vi.release()# 释放摄像头资源
cv.destroyAllWindows()
相关推荐
AgilityBaby1 分钟前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby2 分钟前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA1 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽2 小时前
git 学习
git·学习
audyxiao0012 小时前
计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析
图像处理·人工智能·opencv·目标检测·计算机视觉·大模型·视觉检测
冷凌爱3 小时前
总结HTML中的文本标签
前端·笔记·html
保持学习ing4 小时前
黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+LinkedList)
java·笔记·算法·面试
Moonnnn.4 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr75 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen5 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法