OpenCV 零基础到项目实战 | DAY 1:图像基础与核心操作

发布于:2025-07-23 ⋅ 阅读:(13) ⋅ 点赞:(0)

文章示例代码所需图片,视频资源包已与本文章资源绑定,可前往下载,配套笔记资料也可下载

目录

一、OpenCV介绍

1. OpenCV优势

2. OpenCV-Python

环境安装

图像表示

图像存储

图像基础概念表

二、基本图像操作

1、创建窗体

2、读取图像

3、显示图像

4、保存图像

5、创建黑白图像

6、图像切片(图片剪裁)

7、图像大小调整

三、图像绘制

1、绘制直线

2、绘制圆形

3、绘制矩形

4、绘制文本(向图片中添加文字)

5、读取视频

四、总结

核心注意点总结


一、OpenCV介绍

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

1. OpenCV优势

  • 开源免费:完全开源,可以自由使用,降低开发成本和技术门槛。

  • 多语言支持:除C++原生接口外,还支持Java、Python等编程语言。

  • 跨平台:支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。

  • 丰富API:完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

2. OpenCV-Python

OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了 OpenCV C++ API 的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。

与C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。

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

环境安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

图像表示

像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0代表最黑,1表示最白。

日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。

例如,在使用“画图”软件进行自定义调色时,其数值单位就是像素。如下图所示:

 

 

图像存储

在OpenCV中,无论是读取还是创建图像,结果都是一个NumPy数组。

彩色图像:三维数组            灰度图像:二维

形状(Shape):

图像的尺寸由其高(height)、宽(width)和通道数(channels)决定。可以通过img.shape属性获取这些信息。

  1. 对于彩色图像(如RGB),返回的是一个包含三个值的元组 (height, width, channels)。
  2. 对于灰度图像,返回的是包含两个值的元组 (height, width),因为灰度图像只有一个通道。

数据类型(dtype):

图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。

像素表示

  1. 单通道图像(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低(接近0)颜色越暗;值越高(接近255)颜色越亮。
  2. 多通道图像(彩色图像):OpenCV中,默认情况彩色图像是以BGR(蓝-绿-红)顺序存储

图像基础概念表

概念 描述 关键细节
像素 图像的基本单元,存储颜色、亮度等特征 8 位图像中像素值范围为 0-255(0 为最黑,255 为最白)
颜色模式 图像的颜色通道组合 灰度图:单通道(亮度值)
彩色图:OpenCV 默认BGR 模式(蓝 - 绿 - 红三通道)
图像存储结构 OpenCV 中图像以 NumPy 数组表示 彩色图:三维数组 (height, width, channels)
灰度图:二维数组 (height, width)
数据类型 像素值的存储类型 默认uint8(无符号 8 位整数),取值范围 0-255

二、基本图像操作

1、创建窗体

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

cv2.namedWindow() 方法创建一个新的窗口。可为这个窗口指定一个名称,并可选择窗口的属性

参数:winname:窗口名                      窗口属性:窗口大小是否可调整

  1. cv2.WINDOW_AUTOSIZE:默认,窗口会根据加载的图像自动调整到合适的大小,并且用户不能拖动窗口边缘来调整窗口大小。
  2. cv2.WINDOW_NOEMAL:窗口大小可调整,用户可通过鼠标拖动窗口边缘自由改变窗口
import cv2 as cv
# 读取图片 cv.imread(path,读取方式) 默认读为彩色图片
cat = cv.imread("./images/1.jpg")
cat_black=cv.imread("./images/1.jpg",cv.IMREAD_GRAYSCALE)
cat_red=cv.imread("./images/1.jpg",cv.IMREAD_REDUCED_COLOR_4)
print(cat.shape) # (height, width, channels)
print(cat.dtype) # uint8
# 显示图片 cv.imshow(window, img)
cv.imshow("cat", cat)
# cv.imshow("cat_black", cat_black)
# cv.imshow("cat_red", cat_red)
# 留下绘制时间,cv.waitKey(n)等待n毫秒:40(40ms)0(无限等待)
cv.waitKey(0)
# 释放资源
cv.destroyAllWindows()
# 保存图像
cv.imwrite("./images/cat_gray.jpg", cat_black)

2、读取图像

cv2.imread(path , [读取方式])

参数:filename:图像路径 读取方式:彩色·默认、灰色等

. / 表示当前目录                    . . / 表示当前目录的上一级目录(即父目录)

3、显示图像

cv2.imshow(winname,img)

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

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

  1. cv.waitKey(0):表示无限期地等待任何键盘按键。这种用法常见于图像显示窗口中,确保图像在窗口中显示直到用户决定关闭它。
  2. cv.waitKey(n):n>0,意味着程序将等待n毫秒。这种方式常用于视频播放或实时摄像头捕获场景,以便控制每一帧停留的时间,同时允许用户通过按键来中断循环或发出命令。

cv2.destroyAllWindows([winname])  //销毁窗口

cv2.destroyAllWindows():当前程序执行到该语句时销毁打开的窗口,并释放与这些窗口相关资源

winname:窗口名,关闭指定名称的窗口。可省略,销毁所有已打开的窗口

4、保存图像

cv2.imwrite(path,img)

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

5、创建黑白图像

numpy.zeros((height,width,channels),dtype=np. uint8)

使用np.zeros()创建全黑图像,再修改像素值成为全白图像。

import cv2 as cv
import numpy as np
# 创建全0数组,表示黑色画布
height = 360
width = 480
c=3
black = np.zeros((height, width, c), dtype = np.uint8)
# cv.imshow("black", black)
# 使用np.full()创建全1数组,表示白色画布
white = np.full((height, width, c), 255, dtype = np.uint8)
# cv.imshow("white", white)
# 索引修改像素值
for i in range(height):
    for j in range(width):
        if i == j:
            black[i,j] = [255,255,255]
cv.imshow("black", black)
cv.waitKey(0)
cv.destroyAllWindows()
# 创建随机像素值的图像
dst = np.random.randint(0, 256, (height, width, c), dtype = np.uint8)
cv.imshow("random", dst)
cv.waitKey(0)
cv.destroyAllWindows()

6、图像切片(图片剪裁)

Opencv中,图像切片用于从图像中提取一个子区域(矩形区域)。

假设你有一个图像img,它的类型是numpy.ndarray。img[y:y+h,x:x+w]的含义如下:

      x:子区域左上角的x坐标       y:子区域左上角的y坐标

      w:子区域的宽度                   h:子区域的高度

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

注意:

  1. 边界检查:确保(y,x)和(y+h,x+w)都在图像的边界内,否则会出现索引越界错误。
  2. 数据类型:img通常是numpy.ndarray类型,切片操作返回的也是numpy.ndarray类型。
import cv2 as cv
# 读取图像
cat = cv.imread('./images/1.jpg')
# 切片 arr[h1:h2,w1:w2] h2=h1+h w2=w1+w 
eye = cat[231:297,289:368]
cv.imshow('eye',eye)
cv.waitKey(0)
cv.destroyAllWindows() 

7、图像大小调整

cv2.resize(img,dsize)

是Opencv库中用于调整图像大小的函数,在图像处理中很常用,特别是在要对图像进行缩放时。

参数:img:输入图像             dsize:输出图像的尺寸,是一个二元组(w,h)

import cv2 as cv
import numpy as np
# 读取图像
pubu = cv.imread('./images/bg.png')
print(pubu.shape)   # (998, 1761, 3)
# 调整图像大小resize
pubu = cv.resize(pubu, (500, 400)) # 宽在前,高在后
print(pubu.shape)   # (400, 500, 3)
cv.imshow('pubu', pubu)
cv.waitKey(0)
cv.destroyAllWindows()

基本图像操作函数表

操作名称 核心函数 / 方法 核心参数 说明
创建窗体 cv2.namedWindow(winname, [属性]) winname:窗口名称
属性WINDOW_AUTOSIZE(固定大小)/ WINDOW_NORMAL(可调整大小)
需先创建窗口再显示图像,或直接用imshow自动创建
读取图像 cv2.imread(path, [读取方式]) path:图像路径(./当前目录,../父目录)
读取方式:IMREAD_GRAYSCALE(灰度)、默认彩色
未找到图像时返回None,需检查路径
显示图像 cv2.imshow(winname, img) winname:窗口名称
img:图像数组
必须搭配cv2.waitKey(n)使用(0无限等待,n>0等待 n 毫秒)
保存图像 cv2.imwrite(path, img) path:保存路径 + 文件名
img:待保存图像数组
支持多种格式(如 jpg、png),需确保路径可写
销毁窗口 cv2.destroyAllWindows([winname])

无参数:销毁所有窗口;

winname:销毁指定窗口

释放窗口资源,避免内存泄漏
创建黑白图像 np.zeros((h,w,c) ,dtype=np.uint8) (h,w,c):高度、宽度、通道数
dtypeuint8(像素值范围 0-255)
zeros创建全黑图像,full((h,w,c),255)创建全白图像
图像切片(剪裁) img[y:y+h, x:x+w] y,x:左上角坐标
h,w:高度、宽度
提取从(y,x)开始的矩形区域,需确保坐标在图像边界内
大小调整 cv2.resize(img, dsize) dsize:目标尺寸(w, h)(宽度在前,高度在后) 输出

三、图像绘制

1、绘制直线

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

参数

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

2、绘制圆形

cv2.circle(img,centerpoint,r,color,thickness)

参数:

  • img:要绘制圆形的图片
  • centerpoint、r:圆心和半径
  • color:线条颜色
  • tnickness:线条宽度,为-1时生成闭合图案并填充颜色

3、绘制矩形

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

参数:

  • img:要绘制矩形的图像
  • leftupper、rightdown:矩形的左上角和右下角坐标
  • color:线条的颜色
  • thickness:线条的宽度
import cv2 as cv
# 读取图像
cat = cv.imread('./images/1.jpg')
# 绘制直线 cv2.line(img, pt1, pt2, color, thickness=1, lineType=None, shift=None)
# cv.line(cat, (50, 110), (200, 110), (0, 0, 255), 5)
# 绘制矩形 cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=None, shift=None)
# cv.rectangle(cat, (50, 110), (250, 300), (0, 0, 255), 5)   # -1为填充
# 绘制圆 cv2.circle(img, center, radius, color, thickness=1, lineType=None, shift=None)
cv.circle(cat, (325, 269), 30, (0, 0, 255), 3)
cv.imshow('cat', cat)
cv.waitKey(0) 
cv.destroyAllWindows()

     

4、绘制文本(向图片中添加文字)

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

参数:

  • img:要添加文字的图像
  • text:要写入的文本数据
  • station:文本的放置位置
  • font:字体样式
  • Fontscale:字体大小
  • thickness:字体线条宽度
  • cv2.LINE_AA:使用反走样技术绘制文本边框

反走样是一种提高图形质量的技术,通过混合颜色和像素边缘来减少锯齿状效果,使文本看起来更加平滑、清晰

import cv2 as cv
cat = cv.imread('./images/1.jpg')
# 添加文字 cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)
cat = cv.putText(cat, 'cat like to eat fish', (10, 120), cv.FONT_HERSHEY_SIMPLEX, 2, (255, 100, 0), 4)
cv.imshow('cat', cat)
cv.waitKey(0)
cv.destroyAllWindows()

图像绘制函数表

绘制类型 核心函数 核心参数
绘制直线 cv2.line(img, start, end, color, thickness) start/end:起点 / 终点坐标
color:BGR 格式颜色(如(255,0,0)为蓝色)
thickness:线条宽度
绘制圆形 cv2.circle(img, center, r, color, thickness) center:圆心坐标(x,y)
r:半径
thickness=-1:填充圆形
绘制矩形 cv2.rectangle(img, leftupper, rightdown, color, thickness) leftupper/rightdown:左上角 / 右下角坐标
其他参数同直线
绘制文本 cv2.putText(img, text, pos, font, scale, color, thickness, cv2.LINE_AA) text:文本内容
pos:文本左上角坐标
font:字体样式(如FONT_HERSHEY_SIMPLEX
scale:字体大小
LINE_AA:反走样(平滑边缘)

5、读取视频

cap = cv2.VideoCapture(path)

path:视频流资源路径设置为0,代表从默认摄像头捕获视频流

ret,frame = cap.read()

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

视频读取操作表

操作名称 核心函数 / 方法 核心参数 说明
读取视频 / 摄像头 cv2.VideoCapture(path) path:视频文件路径;0:默认摄像头,1:外接摄像头 创建视频捕获对象,需检查是否打开成功(cap.isOpened()
读取视频帧 ret, frame = cap.read() ret:布尔值(True表示读取成功)
frame:当前帧图像数组
循环读取帧实现视频播放,ret=False时表示视频结束或读取失败
释放视频资源 cap.release() 无参数
import cv2 as cv
# 创建一个videoCapture对象
cap = cv.VideoCapture("./images/videocap.mp4")
# 循环读取每一帧图像
while True:
    # 调用read()方法 读取每一帧图像
    ret, frame = cap.read()
    # 判断是否读取成功
    if not ret:
        print("无法读取视频帧")
        break
    cv.imshow("video", frame)
    if cv.waitKey(40) & 0xFF == ord('q'):
        print("按下q键退出")
        break
cap.release()
cv.destroyAllWindows()


四、总结

核心注意点总结
  1. 颜色通道顺序:OpenCV 默认使用BGR 格式(蓝 - 绿 - 红),与常见的 RGB 格式不同,处理时需注意颜色参数的顺序。
  2. 坐标与尺寸:图像 shape 为(height, width, channels),而resizedsize(width, height),需区分宽 / 高顺序。
  3. 资源释放:所有窗口、视频捕获对象需调用destroyAllWindows()release()释放资源,避免内存泄漏。
  4. 等待函数cv2.waitKey(n)是图像 / 视频显示的关键,确保窗口有足够时间渲染,否则会出现无响应。

OpenCV是一个开源的计算机视觉和机器学习库,支持多种编程语言和平台。OpenCV-Python将C++高性能与Python易用性结合,通过Numpy数组处理图像数据。

涵盖图像基本操作:创建/读取/显示/保存图像、像素处理、图像切片和调整大小;以及图像绘制功能:绘制直线、圆形、矩形和添加文本;

最后介绍视频读取方法。OpenCV广泛应用于图像处理、计算机视觉和机器学习领域,具有开源免费、跨平台和丰富API等优势。


网站公告

今日签到

点亮在社区的每一天
去签到