> 技术文档 > OpenCV快速入门【OpenCV环境安装与基本操作】

OpenCV快速入门【OpenCV环境安装与基本操作】


文章目录

  • 前言
  • 一、OpenCV 简介与环境搭建
    • 1.OpenCV介绍
    • 2.OpenCV环境安装与验证
  • 二、图像的基本表示:NumPy 数组
    • 1.图像在计算机的储存方式
    • 2.图像的访问(显示)和修改像素值
    • 3.图像的基本属性(高度、宽度、通道数)
  • 三、图像的读取与存储
    • 1.读取图像(cv2.imread)
    • 2.保存图像(cv2.imwrite)
  • 四、图像的基本操作
    • 1.图像切片
    • 2.图片的缩放
    • 3.图像的绘制
      • 3.1绘制直线
      • 3.2绘制圆形
      • 3.3绘制矩形
    • 4.视频读取
      • 4.1读取视频文件
      • 4.2捕获摄像头的实时视频流
  • 总结

前言

人工智能(AI)和计算机视觉(CV)技术飞速发展,广泛应用于自动驾驶、医疗影像、安防监控等地方。而 OpenCV(Open Source Computer Vision Library)作为最流行的开源计算机视觉库之一,凭借其强大的功能和高效的性能,成为开发者必备的工具。

本文将从 OpenCV 环境搭建 开始,介绍 图像的 NumPy 数组表示、图像读取与存储、基本操作(裁剪、缩放、绘制等),以及 如何对视频进行读取,帮助初学者快速上手 OpenCV,并理解计算机视觉的基础知识。


一、OpenCV 简介与环境搭建

1.OpenCV介绍

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

2.OpenCV环境安装与验证

OpenCV的安装需要使用conda的环境,首先激活需要安装的Python环境,在该环境下执行下列代码:

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

通过list查看是否安装成功:

pip list versions opencv-python

conda环境配置可以查看往期文章Conda环境配置里面的对应操作。

二、图像的基本表示:NumPy 数组

1.图像在计算机的储存方式

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0,代表最黑,255,表示最白。
OpenCV快速入门【OpenCV环境安装与基本操作】
我们可以把一张图片看为一个三维数组,数组的最外两层作为一张图片的高和宽,以此来定位一个像素位置,而每一个像素位置都为一个一维数组,用于实现一个像素点位通过三个通道实现像素的颜色多样化(RGB)
OpenCV快速入门【OpenCV环境安装与基本操作】
通过RGB通道实现了图像的颜色混合,称这类混合颜色构图为RGB图像,RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。

2.图像的访问(显示)和修改像素值

在访问图像之前我们先用一个numpy构建一个三维数组作为一个构建图片的对象:

#导入numpy库import numpy as np#创建一个全零数组height = 512#图像高度width = 512#图像宽度c= 3#通道数#创建一张全黑图像(0为最黑)black = np.zeros((height,width,c),np.uint8)

上图中的black对象其实就是一个图像,但是怎么也看不出来图片的样子,这是我们就需要OpenCV来实现图片的显示,完整代码如下:

#首先导入OpenCV库(这里导入名称为CV2)import cv2 as cv#导入numpy库import numpy as np#创建一个全零数组height = 512#图像高度width = 512#图像宽度c= 3#通道数#创建一张全黑图像(0为最黑)black = np.zeros((height,width,c),np.uint8)#通过OpenCV的类方法imshow(\'图像窗口名\',显示的对象)实现图像的显示cv.imshow(\"black\",black)#设置窗口显示时间(ms)cv.waitKey(0)#释放资源销毁所有窗口cv.destroyAllWindows()

注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来
执行后就可以看到你的电脑打开了一个名为black的全黑窗口
既然图像都为一个numpy多位数组那我们就可以通过数组索引来修改图像的像素值改变图像颜色,还可以通过numpy方法实现图像的构造:

# 索引修改像素值,表示白色图像black[:,:,:] = 255black[:,:] = 255black[:] = 255cv.imshow(\"black\",black)#以上三中方式都可以实现将black全黑图像改为全白图像#通过np.full方法填充三维数组的像素值实现构造全白图像white = np.full((height,width,c),255,np.uint8)cv.imshow(\"white\",white)#设置窗口显示时间(ms)cv.waitKey(0)#释放资源销毁所有窗口cv.destroyAllWindows()

3.图像的基本属性(高度、宽度、通道数)

根据上述可知图像都可以用一个三维数组来表示,那么每一个维度数值就代表了图像的基本属性
通过shape示例方法访问属性:

import cv2 as cva = np.zeros((512,420,3),np.uint8)print(a.shape)#输出:(512,420,3)

这个元组的每一个数分别对应了图像的高度、宽度、通道三个属性,由面向对象编程角度理解,图像归结为一个类,其中的高度、宽度、通道为图像类的实例属性

三、图像的读取与存储

计算机视觉的第一步,就是让程序“看见”图像。我们可以利用 OpenCV 的api调用实现图像的读取、显示和保存图像文件。

1.读取图像(cv2.imread)

cv2.imread(path [,读取方式])
读取方式:彩色·默认、灰色等
示例:

import cv2 as cvcat = cv.imread(\"../images/1.jpg\")print(cat)cv.imshow(\"cat\",cat)#显示图像#绘制时间:cv.waitKey(n)等待n毫秒,n为0表示无限等待cv.waitKey(0)#释放资源cv.destroyAllWindows()

注意:../images/1.jpg这里表示的是:在当前目录的上一个目录下有一个images目录,里面的文件1.jpg
./ 表示当前目录。
../ 表示当前目录的上一级目录(即父目录)。当你需要引用或访问当前目录所在位置的上一层目录中的文件或文件夹时使用 ../

2.保存图像(cv2.imwrite)

cv2.imwrite(path,img)

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

示例:

import cv2 as cvcat1 = cv.imread(\"../images/1.jpg\",cv.IMREAD_GRAYSCALE)print(cat)cv.imshow(\"cat1\",cat1)#显示图像cv.imwrite(\"./gray.jpg\",cat1)#保存图片#绘制时间:cv.waitKey(n)等待n毫秒,n为0表示无限等待cv.waitKey(0)#释放资源cv.destroyAllWindows()

cv.imwrite(\"./gray.jpg\",cat1)表示将进过灰通道读取的cat1作为新的图像被保存到当前目录下,文件名为gray.jpg

四、图像的基本操作

1.图像切片

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

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

    • x:子区域左上角的x坐标
    • y:子区域左上角的y坐标
    • w:子区域的宽度
    • h:子区域的高度
  • 切片操作

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

具体操作示例:

import cv2 as cvimport numpy as np#读取图片cat = cv.imread(\"../images/1.jpg\")#用切片的方法剪切图片eye = cat[240:300,290:360]#对剪切的图片进行缩放resize()eye = cv.resize(eye,(300,300))#用窗口打开剪切的图片cv.imshow(\"eye\",eye)#通过imwrite()保存图片cv.imwrite(\"eye.jpg\",eye)head = cat[190:480,220:550]head = cv.resize(head,(300,300))cv.imshow(\"head\",head)cv.imwrite(\"head.jpg\",head)#设置窗口显示时间cv.waitKey(0)#销毁所有窗口cv.destroyAllWindows()

注意:

  • **边界检查:**确保(y,x)(y+h,x+w)都在图像的边界内,否则会出现索引越界错误。
  • 数据类型:img通常是numpy.ndarray类型,切片操作返回的也是numpy.ndarray类型。

2.图片的缩放

  • cv2.resize是Opencv库中用于调整图像大小的函数,在图像处理中很常用,特别是在要对图像进行缩放以适应不同需求时。

  • cv2.resize(img,dsize)

    • img:输入图像,通常是二维或三位NumPy数组。
    • dsize:输出图像的尺寸,是一个二元组(w,h)

示例:

import cv2 as cvimport numpy as np#读取图像cat = cv.imread(\"../images/1.jpg\")#调整图像大小cv.resize(image,(宽,高))cat1 = cv.resize(cat,(400,400))cv.imshow(\"cat1\",cat1)cv.waitKey(0)cv.destroyAllWindows()

3.图像的绘制

3.1绘制直线

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

示例:

import cv2 as cv#图像绘制(宽在前,高在后)#读取图片文件cat = cv.imread(\"../images/1.jpg\")#使用cv.line()函数绘制直线(宽在前,高度在后)cv.line(cat,(0,0),(500,500),(255,0,0),thickness=5)#直接改变原图像cv.imshow(\"cat\",cat)cv.imshow(\"cat\",cat)cv.waitKey(0)cv.destroyAllWindows()

注意:图像绘制时都遵从(宽在前,高在后)

3.2绘制圆形

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

示例:

import cv2 as cv#图像绘制(宽在前,高在后)#读取图片文件cat = cv.imread(\"../images/1.jpg\")#绘制圆形cv.circle(img,圆心,半径,color,thickness,cv.LINE_AA)thickness=-1表示填充# cv.LINE_AA反走样,抗锯齿,平滑,默认是cv.LINE_8cv.circle(cat,(250,250),100,(0,0,255),thickness=5,lineType=cv.LINE_AA)cv.circle(cat,(322,272),30,(255,0,0),thickness=-1,lineType=cv.LINE_AA)cv.imshow(\"cat\",cat)cv.waitKey(0)cv.destroyAllWindows()

3.3绘制矩形

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

示例:

import cv2 as cv#图像绘制(宽在前,高在后)#读取图片文件cat = cv.imread(\"../images/1.jpg\")#绘制矩形cv.rectangle (img,左上角,右下角,color,thickness)thickness=-1表示填充cv.rectangle(cat,(0,0),(500,500),(0,255,0),thickness=5)cv.imshow(\"cat\",cat)cv.waitKey(0)cv.destroyAllWindows()

4.视频读取

  • cap = cv2.VideoCapture(path)
  • path:视频流资源路径设置为0,代表从默认摄像头捕获视频流
  • ret,frame = cap.read()
  • 返回值cap调用read()方法得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。

4.1读取视频文件

import cv2 as cv#创建一个vidoeCapture对象#读取视频文件cap = cv.VideoCapture(\"../images/videocap.mp4\")#获取视频的帧数frame_count = cap.get(cv.CAP_PROP_FRAME_COUNT)#循环读取每一帧while True: #读取每一帧 ret,frame = cap.read() #判断是否读取成功 if not ret: #播放完毕 print(\"视频播放完毕\") break #显示每一帧 cv.imshow(\"video\",frame) #退出播放按键 if cv.waitKey(2)&0xFF == ord(\'q\'): print(\"按键q退出\") break#释放摄像头资源cap.release()#释放窗口资源cv.destroyAllWindows()

4.2捕获摄像头的实时视频流

import cv2 as cv#创建一个vidoeCapture对象#从默认摄像头创建一个vidoeCapture对象获取实时视频流cap = cv.VideoCapture(0)#循环读取每一帧while True: #读取每一帧 ret,frame = cap.read() #判断是否读取成功 if not ret: #播放完毕 print(\"视频播放完毕\") break #显示每一帧 cv.imshow(\"video\",frame) #退出播放按键 if cv.waitKey(2)&0xFF == ord(\'q\'): print(\"按键q退出\") break#释放摄像头资源cap.release()#释放窗口资源cv.destroyAllWindows()

总结

OpenCV 是计算机视觉领域的基石,掌握它的基本操作能让你在 AI 开发中更加得心应手。本文从 环境搭建 到 图像处理,再到 基本绘制,带你快速入门 OpenCV。