OpenCV基础入门
OpenCV是一个开源的计算机视觉库,包含2500+优化算法,支持图像处理、视频分析、目标检测等功能。它跨平台运行,提供C++、Python等多种语言接口,广泛应用于工业、医疗、自动驾驶等领域。本文介绍了OpenCV的安装配置、基础图像操作(读取、显示、保存、剪裁、调整大小)、图像绘制(直线、圆形、矩形、文本)以及视频读取方法。通过代码示例展示了如何使用OpenCV进行基本的计算机视觉处理,适合初
1. OpenCV概述
OpenCV的定义
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它包含超过2500种优化算法,涵盖图像处理、视频分析、物体检测、面部识别、3D重建等核心功能。OpenCV支持跨平台运行(如Windows、Linux、macOS、Android、iOS),并提供C++、Python、Java等语言的接口,广泛应用于工业检测、医疗影像、自动驾驶、增强现实等领域。
开发背景
OpenCV由Intel于1999年发起,旨在促进计算机视觉技术的普及和研究。项目最初由Gary Bradsky和Vadim Pisarevsky主导,2000年首次公开测试版。2006年发布1.0版本,2012年成立非营利组织OpenCV.org维护后续开发。OpenCV的设计目标包括:
-
高效性:通过硬件加速(如Intel IPP)和算法优化实现实时处理。
-
易用性:提供简洁的API和丰富的文档,降低计算机视觉的开发门槛。
-
社区驱动:开源模式吸引全球开发者贡献代码,形成活跃的生态。
-
多语言支持:核心模块用C++编写,同时提供Python封装(如
cv2模块)。 -
模块化结构:包含
core(基础数据结构)、imgproc(图像处理)、objdetect(目标检测)等子库。 -
硬件兼容:支持CPU/GPU加速(如OpenCL、CUDA)和嵌入式设备(如树莓派)。
-
扩展性:可集成TensorFlow、PyTorch等深度学习框架。
-
主要特点:跨平台、开源、高效算法支持
-
应用场景:图像处理、视频分析、机器学习
OpenCV优势
-
开源免费:完全开源,可以自由使用,降低开发成本和技术门槛。
-
多语言支持:除C++原生接口外,还支持Java、Python等编程语言。
-
跨平台:支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。
-
丰富API:完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。
2. 安装与环境配置
-
支持平台:Windows、Linux、macOS
-
安装方法:pip/conda安装、源码编译
-
依赖项管理:NumPy、Matplotlib
创建并激活名为myenv的虚拟环境:
conda create -n myenv python=3.8

小编这里已经创建好了,使用conda env list可以查看当前所创建的所有虚拟环境。
安装OpenCV库,倘若这个命令下载不了就换下一个代码试试:
conda activate myenv
conda install -c conda-forge opencv
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

activate 自己创建的虚拟环境名:表示切换到自己创建的虚拟环境中。根据步骤下载opencv即可。
验证安装是否成功:
python -c "import cv2; print(cv2.__version__)"

安装完成后进入python中导入opencv可查看版本号,即表明下载成功。
3. 基础图像操作
- 创建窗体:cv2.namedWindow("winname",[窗口属性])
import cv2 as cv
# 创建一个窗体 WINDOW_AUTOSIZE自动大小窗体 WNDOW_NORMAL可手动调整
#cv.namedWindow("mycv",cv.WINDOW_AUTOSIZE)
cv.namedWindow("mycv2",cv.WINDOW_NORMAL)
cv.waitKey(0)
#销毁所有窗体,释放所有资源
cv.destroyAllWindows()
-
读取图像:cv2.imread(path,[读取方式])
-
图像显示:
cv2.imshow("winname",img)
import cv2 as cv
# 创建一个窗体 WINDOW_AUTOSIZE自动大小窗体 WNDOW_NORMAL可手动调整
#cv.namedWindow("mycv",cv.WINDOW_AUTOSIZE)
cv.namedWindow("mycv2",cv.WINDOW_NORMAL)
#读取图片 路径可相对可绝对
img = cv.imread("D:\AI\Opencv\images\\1.jpg")
#cv.IMREAD_GRAYSCALE表示以灰度模式读取图像
img2 = cv.imread("D:\AI\Opencv\images\\1.jpg",cv.IMREAD_GRAYSCALE)
cv.imshow("mycv2",img)
#留下绘制时间,等待n毫秒
cv.waitKey(0)
#销毁所有窗体,释放所有资源
cv.destroyAllWindows()
-
保存图像:cv2.imwrite(path,img)
import cv2 as cv
# 创建一个窗体 WINDOW_AUTOSIZE自动大小窗体 WNDOW_NORMAL可手动调整
#cv.namedWindow("mycv",cv.WINDOW_AUTOSIZE)
cv.namedWindow("mycv2",cv.WINDOW_NORMAL)
#读取图片 路径可相对可绝对
img = cv.imread("D:\AI\Opencv\images\\1.jpg")
#cv.IMREAD_GRAYSCALE表示以灰度模式读取图像
img2 = cv.imread("D:\AI\Opencv\images\\1.jpg",cv.IMREAD_GRAYSCALE)
#保存图像
cv.imwrite("D:\AI\Opencv\images\\1_gray.jpg",img2)
#显示图片
#cv.imshow("mycv",img2)
cv.imshow("mycv2",img)
#留下绘制时间,等待n毫秒
cv.waitKey(0)
#销毁所有窗体,释放所有资源
cv.destroyAllWindows()
-
创建黑白图像:可使用np.zeros()创建全黑图像,np.full()修改像素值成为全白图像。
import cv2 as cv
import numpy as np
#黑色创建
black = np.zeros((640,480,3),dtype=np.uint8)
#cv.imshow("black",black)
#白色创建
white = np.full((640,480,3),255,dtype=np.uint8)
#cv.imshow("white",white)
#创建随机像素
random = np.random.randint(0,256,(640,480,3),dtype=np.uint8)
cv.imshow("random",random)
#显示
cv.waitKey(0)
cv.destroyAllWindows()
4.图片剪裁:
-
假设你有一个图像
img,它的类型是numpy.ndarray。img[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 cv
img = cv.imread("D:\AI\Opencv\images\\1_gray.jpg")
#此处坐标图可用Windows自带的画图软件进行查看(280,230)(360,300)
#roi表示感兴趣区域,仅是命名,符合python命名即可
roi = img[230:300,280:360]
cv.imshow("img",roi)
#修改剪裁区域的颜色
roi[:,:] = [0,0,255]
cv.imshow("img1",img)
cv.waitKey(0)
cv.destroyAllWindows()
-
图像大小调整:cv2.resize(img,dsize)
-
img:输入图像,通常是二维或三位NumPy数组。
-
dsize:输出图像的尺寸,是一个二元组
(w,h)
-
import cv2 as cv
img = cv.imread("D:\AI\Opencv\images\\1.jpg")
#调整图像大小(w,h) (宽,高)
dst = cv.resize(img,dsize=(500,500))
cv.imshow("img",img)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
5.图像绘制
-
绘制直线:cv2.line(img,sart,end,color,thickness)
-
img:要绘制直线的图像
-
start、end:直线的起点和终点
-
color:直线的颜色(对于彩色图像,使用 BGR 格式指定颜色)
-
thickness:线条宽度
-
-
绘制圆形:cv2.circle(img,centerpoint,r,color,thickness)
-
img:要绘制圆形的图片
-
centerpoint、r:圆心和半径
-
color:线条颜色
-
tnickness:线条宽度,为-1时生成闭合图案并填充颜色
-
-
绘制矩形:cv2.rectangle(img,leftupper,rightdown,color,thickness)
-
img:要绘制矩形的图像
-
leftupper、rightdown:矩形的左上角和右下角坐标
-
color:线条的颜色
-
thickness:线条的宽度
-
-
绘制文本(向图片中添加文字):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
img = cv.imread("D:\AI\Opencv\images\\1_gray.jpg")
#绘制直线
cv.line(img,(200,200),(123,123),(0,255,0),2)
#绘制圆
cv.circle(img,(100,100),50,(0,0,255),-1,cv.LINE_AA)
#绘制矩形
cv.rectangle(img,(100,100),(200,200),(255,0,0),2)
#绘制文本
cv.putText(img,"hello",(100,100),cv.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)
cv.imshow("img1",img)
cv.waitKey(0)
cv.destroyAllWindows()
6.读取视频:
-
cap = cv2.VideoCapture(path)
-
path:视频流资源路径设置为0,代表从默认摄像头捕获视频流
-
-
ret,frame = cap.read()
-
返回值cap调用read()方法得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。
import cv2 as cv
mv = cv.VideoCapture("D:\AI\Opencv\images\\videocap.mp4")
mv1 = cv.VideoCapture(0)
#循环读取视频,每一帧
while True:
ret,frame = mv1.read()
#判断是否读取成功
if not ret:
print("视频读取失败!")
break
cv.imshow("mv",frame)
#检测用户是否按下了键盘上的 "q" 键,如果按下了就退出循环。
if cv.waitKey(1) & 0xFF == ord("q"):
break
#释放视频对象
mv.release()
cv.destroyAllWindows()
7. 总结与展望
OpenCV作为计算机视觉领域的强大工具,凭借其开源特性、跨平台支持以及丰富的功能库,已成为开发者、研究人员和工程师的首选。通过本教程,我们学习了OpenCV的基础操作,包括环境配置、图像处理、视频读取等核心功能,为后续深入学习和实际应用奠定了坚实基础。
未来,随着人工智能和计算机视觉技术的快速发展,OpenCV将继续在自动驾驶、医疗影像、工业检测等领域发挥重要作用。希望你能以此为契机,进一步探索OpenCV的高级功能,结合深度学习框架(如TensorFlow、PyTorch)开发更智能的视觉应用。
实践建议:
- 多动手尝试代码示例,理解每个参数的作用。
- 参与开源社区,贡献代码或分享经验。
- 关注OpenCV官方更新,学习新特性(如DNN模块、实时性能优化)。
计算机视觉的世界充满无限可能,愿OpenCV成为你探索之旅的得力伙伴!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)