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.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 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成为你探索之旅的得力伙伴!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐