OpenCV初识

news2024/9/29 15:31:27

1、OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的C函数和少量C++类构成,同时提供Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

# 导入OpenCV库

import cv2



# 打印OpenCV版本

print(cv2.__version__)

输出:

4.5.2

OpenCV的设计目标是提供一套简单而且可扩展的计算机视觉库,使得它能够方便地在实际的应用、研究、开发中被使用。

2、OpenCV的应用领域

OpenCV具有极广的应用领域,它包括但不限于:

  • 人脸识别和物体识别

这是OpenCV的一项重要功能,应用在许多领域,如安全监控、交互设计等。

  • 图像和视频分析

如图像增强、图像分割、视频跟踪等。

  1. 图像合成和3D重建

在图像处理和计算机视觉领域,OpenCV可以用于创建AR或VR效果,生成3D模型等。

  • 机器学习

OpenCV内置了大量的机器学习算法,可以用于图像分类、聚类等任务。

  • 深度学习

OpenCV中的dnn模块提供了一系列深度学习模型的接口,用户可以加载预训练模型进行图像识别、目标检测等任务。

# 例如,以下代码展示了如何使用OpenCV进行图像读取和显示

import cv2



# 读取一张图像

img = cv2.imread('image.jpg')



# 显示图像

cv2.imshow('image', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

综上,OpenCV凭借其强大的功能、开源的优势以及广泛的应用领域,成为了学者和工业界的重要工具。

3、OpenCV的下载与安装配置

3.1 下载 

http://ffmpeg.club/opencv_download.html

3.2 安装配置

OpenCV的安装方式根据不同的操作系统和使用环境有所不同。以下我们将分别介绍在Windows、Linux和Mac OS下的安装方式,以及如何配置Python环境使用OpenCV。

3.2.1 OpenCV在Windows系统下的安装

在Windows系统下,推荐使用Python的包管理工具pip来安装OpenCV。你可以在命令行中运行以下命令来安装:

pip install opencv-python

如果你需要使用到OpenCV的额外模块(如xfeatures2d等),可以安装opencv-contrib-python包:

pip install opencv-contrib-python

3.2.2 OpenCV在Linux系统下的安装

在Linux系统下,我们同样可以使用pip来安装OpenCV。打开终端,运行以下命令:

pip install opencv-python

同样,如果你需要使用到OpenCV的额外模块,可以安装opencv-contrib-python包:

pip install opencv-contrib-python

3.2.3 OpenCV在Mac OS系统下的安装

在Mac OS下,我们同样可以使用pip来安装OpenCV。打开终端,运行以下命令:

pip install opencv-python

如果你需要使用到OpenCV的额外模块,可以安装opencv-contrib-python包:

pip install opencv-contrib-python

3.2.4 配置Python环境使用OpenCV

安装完成OpenCV后,我们可以在Python环境中导入cv2模块来使用OpenCV的功能。你可以创建一个新的Python脚本,然后在其中输入以下代码来测试OpenCV是否安装成功:

import cv2



# 打印OpenCV版本

print(cv2.__version__)

4、OpenCV基础

4.1 图像的载入、显示和保存

在OpenCV中,我们通常使用imread()函数来载入一张图像,使用imshow()函数来显示一张图像,使用imwrite()函数来保存一张图像。

以下是一个示例:

import cv2



# 载入一张图像

img = cv2.imread('image.jpg')



# 显示图像

cv2.imshow('image', img)

cv2.waitKey(0)

cv2.destroyAllWindows()



# 保存图像

cv2.imwrite('new_image.jpg', img)

4.2 图像的基础操作

OpenCV提供了一系列的函数来进行图像的基础操作,包括但不限于:

  1. 获取和修改像素值
  2. 获取图像的基本属性(如大小、通道数、像素数等)
  3. 设置图像的ROI(Region of Interest)
  4. 拆分和合并图像通道
# 获取和修改像素值

px = img[100,100]

print(px)



# 修改像素值

img[100,100] = [255,255,255]

print(img[100,100])



# 获取图像属性

print(img.shape)

print(img.size)

print(img.dtype)



# 设置ROI

roi = img[100:200, 100:200]



# 拆分和合并图像通道

b,g,r = cv2.split(img)

img = cv2.merge((b,g,r))

4.3 图像色彩空间的转换

OpenCV提供了200+种颜色空间的转换方法,但是我们最常用的还是RGB<->Gray和RGB<->HSV的转换。

我们可以使用cv2.cvtColor()函数来进行颜色空间的转换,如下例:

# 转换为灰度图像

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)



# 转换为HSV图像

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

这是OpenCV基础操作的简单介绍,这些操作是我们在进行更高级的图像处理之前需要掌握的基础知识。

4.4 图像处理与计算机视觉基础

在计算机视觉中,图像处理是一个关键的环节,它包括图像阈值化、边缘检测、图像滤波、图像形态学操作和图像二值化等操作。

4.4.1 图像阈值化

图像阈值化是将图像从灰度转换为二值化图像的过程,OpenCV提供了cv2.threshold()函数来进行这项操作。

import cv2

import numpy as np



# 载入图像并转为灰度图

img = cv2.imread('image.jpg',0)



# 阈值化处理

ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)



# 显示处理结果

cv2.imshow('threshold',thresh1)

cv2.waitKey(0)

cv2.destroyAllWindows()

4.4.2 边缘检测

边缘检测是计算机视觉中的常见任务,它可以用来识别图像中的物体。Canny边缘检测是一种常用的边缘检测算法,OpenCV中可以使用cv2.Canny()函数来进行Canny边缘检测。

import cv2

import numpy as np



# 载入图像

img = cv2.imread('image.jpg',0)



# 进行Canny边缘检测

edges = cv2.Canny(img,100,200)



# 显示处理结果

cv2.imshow('edges',edges)

cv2.waitKey(0)

cv2.destroyAllWindows()

4.4.3 图像滤波

图像滤波是计算机视觉中常见的图像预处理方法,OpenCV提供了各种滤波函数,如cv2.filter2D()、cv2.blur()、cv2.GaussianBlur()等。

import cv2

import numpy as np



# 载入图像

img = cv2.imread('image.jpg')



# 使用高斯滤波进行图像平滑处理

blur = cv2.GaussianBlur(img,(5,5),0)



# 显示处理结果

cv2.imshow('blur',blur)

cv2.waitKey(0)

cv2.destroyAllWindows()

4.4.4 图像形态学操作

形态学操作是基于图像形状的一系列操作,包括腐蚀、膨胀、开运算和闭运算等。OpenCV提供了cv2.erode()、cv2.dilate()、cv2.morphologyEx()等函数来进行形态学操作。

import cv2

import numpy as np



# 载入图像

img = cv2.imread('image.jpg',0)



# 创建一个5x5的结构元素

kernel = np.ones((5,5),np.uint8)



# 进行膨胀操作

dilation = cv2.dilate(img,kernel,iterations = 1)



# 显示处理结果

cv2.imshow('dilation',dilation)

cv2.waitKey(0)

cv2.destroyAllWindows()

4.4.5 图像二值化

二值化是将图像处理为只有两个颜色的过程,也就是将图像处理为黑白两色。二值化后的图像对于很多图像处理任务(如边缘检测、物体识别等)有很大的帮助,OpenCV中可以使用cv2.threshold()函数来进行二值化操作。

import cv2

import numpy as np



# 载入图像

img = cv2.imread('image.jpg',0)



# 进行二值化操作

ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)



# 显示处理结果

cv2.imshow('binary',thresh1)

cv2.waitKey(0)

cv2.destroyAllWindows()

5、实战案例

5.1 人脸检测

首先,我们来实现一个简单的人脸检测程序。这个程序可以读取一个图像,然后使用预训练的Haar级联分类器检测图像中的人脸。

import cv2



# 加载预训练的人脸级联分类器

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')



# 读取图像

img = cv2.imread('face.jpg')



# 将图像转换为灰度图

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)



# 使用级联分类器检测人脸

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))



# 为每个检测到的人脸绘制一个矩形

for (x, y, w, h) in faces:

    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)



# 显示结果

cv2.imshow('Faces found', img)

cv2.waitKey(0)

5.2 实时人脸检测

接下来,我们来实现一个实时的人脸检测程序。这个程序可以实时地从摄像头捕获视频,并检测视频中的人脸。

import cv2



# 加载预训练的人脸级联分类器

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')



# 打开摄像头

cap = cv2.VideoCapture(0)



while True:

    # 读取一帧

    ret, frame = cap.read()



    # 将帧转换为灰度图

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)



    # 使用级联分类器检测人脸

    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))



    # 为每个检测到的人脸绘制一个矩形

    for (x, y, w, h) in faces:

        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)



    # 显示结果

    cv2.imshow('Faces found', frame)



    # 按'q'退出循环

    if cv2.waitKey(1) & 0xFF == ord('q'):

        break



# 释放摄像头

cap.release()



# 关闭所有窗口

cv2.destroyAllWindows()

5.3 目标跟踪

接下来的实战案例是使用MeanShift算法进行目标跟踪。我们将从视频中选择一个目标,然后在后续的帧中跟踪这个目标。

import cv2

import numpy as np



# 打开摄像头

cap = cv2.VideoCapture(0)



# 读取第一帧

ret, frame = cap.read()



# 设置初始的窗口位置

r, h, c, w = 240, 100, 400, 160

track_window = (c, r, w, h)



# 设置初始的ROI用于跟踪

roi = frame[r:r+h, c:c+w]

hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))

roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])

cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)



# 设置终止条件,迭代10次或者至少移动1次

term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)



while(True):

    ret, frame = cap.read()



    if ret == True:

        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

        dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)



        # 使用MeanShift算法找到新的位置

        ret, track_window = cv2.meanShift(dst, track_window, term_crit)



        # 在图像上画出新的窗口位置

        x, y, w, h = track_window

        img2 = cv2.rectangle(frame, (x, y), (x+w, y+h), 255, 2)

        cv2.imshow('img2', img2)



        if cv2.waitKey(1) & 0xFF == ord('q'):

            break

    else:

        break



cap.release()

cv2.destroyAllWindows()

5.4 边缘检测

边缘检测是图像处理中的重要步骤,它可以帮助我们从图像中识别出物体的轮廓。下面的实战案例是使用Canny算法进行边缘检测。

import cv2

import numpy as np



# 读取图像

img = cv2.imread('road.jpg', 0)



# 使用Canny算法进行边缘检测

edges = cv2.Canny(img, 50, 150)



# 显示原图和边缘检测结果

cv2.imshow('Original Image', img)

cv2.imshow('Edge Image', edges)



cv2.waitKey(0)

cv2.destroyAllWindows()

5.5 图像拼接

图像拼接是将两个或多个图像在一定的几何和光度条件下拼接在一起,形成一个包含了所有输入图像视场的大视场图像。以下实战案例将展示如何使用OpenCV进行图像拼接。

import cv2

import numpy as np



# 读取两个图像

img1 = cv2.imread('road1.jpg')

img2 = cv2.imread('road2.jpg')



# 将两个图像拼接成一个图像

stitcher = cv2.Stitcher.create()

result, pano = stitcher.stitch([img1, img2])



if result == cv2.Stitcher_OK:

    cv2.imshow('Panorama', pano)

    cv2.waitKey()

    cv2.destroyAllWindows()

else:

    print("Error during stitching.")

6、深度学习与OpenCV

OpenCV库不仅提供了大量的基本图像处理函数,还为深度学习领域提供了强大的支持。它可以用来加载预训练的模型,并使用这些模型进行图像分类、对象检测、图像分割等任务。下面我们将通过一些实战案例来深入了解OpenCV如何应用在深度学习中。

6.1 加载预训练模型

首先,我们将学习如何加载一个预训练的模型。我们将使用OpenCV中的DNN模块,该模块支持多种深度学习框架,包括TensorFlow、Caffe等。

import cv2



# 加载预训练的模型

net = cv2.dnn.readNetFromCaffe('bvlc_googlenet.prototxt', 'bvlc_googlenet.caffemodel')

6.2 图像分类

接下来,我们将使用加载的模型进行图像分类。我们将对一个图像进行预处理,然后将其输入到模型中,获取分类结果。

import cv2

import numpy as np



# 加载预训练的模型

net = cv2.dnn.readNetFromCaffe('bvlc_googlenet.prototxt', 'bvlc_googlenet.caffemodel')



# 加载标签名

with open('synset_words.txt', 'r') as f:

    labels = f.read().strip().split("\n")



# 加载图像,并进行预处理

image = cv2.imread('image.jpg')

blob = cv2.dnn.blobFromImage(image, 1, (224, 224), (104, 117, 123))



# 将图像输入到网络中,进行前向传播,得到输出结果

net.setInput(blob)

outputs = net.forward()



# 获取预测结果

class_id = np.argmax(outputs)

label = labels[class_id]



print('Output class:', label)

6.3 物体检测

此外,我们还可以使用预训练的模型进行物体检测。我们将使用预训练的YOLO模型来检测图像中的物体。

import cv2

import numpy as np



# 加载预训练的模型

net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')



# 加载图像,并进行预处理

image = cv2.imread('image.jpg')

blob = cv2.dnn.blobFromImage(image, 1/255, (416, 416), swapRB=True, crop=False)



# 将图像输入到网络中,进行前向传播,得到输出结果

net.setInput(blob)

layer_names = net.getLayerNames()

output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

outputs = net.forward(output_layers)



# 处理网络的输出结果

for output in outputs:

    for detection in output:

        scores = detection[5:]

        class_id = np.argmax(scores)

        confidence = scores[class_id]



        if confidence > 0.5:

            # 将检测到的物体在图像上标记出来

            center_x, center_y, w, h = map(int, detection[0:4] * np.array([image.shape[1], image.shape[0], image.shape[1], image.shape[0]]))

            x = center_x - w // 2

            y = center_y - h // 2

            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)



cv2.imshow('Image', image)

cv2.waitKey(0)

cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端学习——js篇】11.元素可见区域

具体见&#xff1a;https://github.com/febobo/web-interview 11.元素可见区域 ①offsetTop、scrollTop offsetTop&#xff0c;元素的上外边框至包含元素的上内边框之间的像素距离&#xff0c;其他offset属性如下图所示&#xff1a; 下面再来了解下clientWidth、clientHeight…

Memcached非关系型数据库介绍

使用背景 Memcached 不是一个数据库&#xff0c;而是一个高性能的分布式内存对象缓存系统。它主要用于减轻数据库负载&#xff0c;提高动态Web应用的速度、可扩展性和性能。Memcached 的工作原理是将数据存储在内存中&#xff0c;以提供快速的数据访问。当应用程序需要访问数据…

android 11 SystemUI 状态栏打开之后的界面层级关系说明之一

比如WiFi 图标的父layout为&#xff1a; Class Name: ButtonRelativeLayout Class Name: QSTileView Class Name: TilePage Class Name: PagedTileLayout Class Name: QSPanel Class Name: NonInterceptingScrollView Class Name: QSContainerImpl Class Name: FrameLayout Cl…

Docker搭建LNMP环境实战(06):Docker及Docker-compose常用命令

Docker搭建LNMP环境实战&#xff08;06&#xff09;&#xff1a;Docker及Docker-compose常用命令 此处列举了docker及docker-compose的常用命令&#xff0c;一方面可以做个了解&#xff0c;另一方面可以在需要的时候进行查阅。不一定要强行记忆&#xff0c;用多了就熟悉了。 1、…

Qt扫盲-QAssisant 集成其他qch帮助文档

QAssisant 集成其他qch帮助文档 一、概述二、Cmake qch例子1. 下载 Cmake.qch2. 添加qch1. 直接放置于Qt 帮助的目录下2. 在 QAssisant中添加 一、概述 QAssisant是一个很好的帮助文档&#xff0c;他提供了供我们在外部添加新的 qch帮助文档的功能接口&#xff0c;一般有两中添…

无人机+AI平安校园系统在天津大学成功运行

8月17日&#xff0c;北方天途航空联合天津大学&#xff0c;运用天途平安校园管理平台和大疆无人机场&#xff0c;开展无人机智能监控试点任务&#xff0c;协助学校保卫处监控人员和车辆情况&#xff0c;进行安全疏导和分流。 观看天途平安校园系统演示 现场工程师把天途平安校园…

[Linux_IMX6ULL驱动开发]-基础驱动

驱动的含义 如何理解嵌入式的驱动呢&#xff0c;我个人认为&#xff0c;驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态&#xff0c;是无法直接操控底层的硬件的。我们需要利用系统调用&#xff08;open、read、write等&#xff09;&#xff0c;进入内核态…

48 div 下面包含 el-radio, 点击 div 事件被触发多次

前言 这是一个最近碰到的一个很奇怪的问题 情况如下一个 div 下面有一个 el-radio, 然后 div 上面配置了 click 的回调为 handleClick 然后 但是点击 div 的时候, handleClick 触发了两次 然后 这里 来模拟一下, 并解决一下 这个问题 这里的知识主要是 设计到 label 和 …

机器人深度学习IMU和图像数据实现焊接精细操作

在双电极气体保护金属弧焊 &#xff08;DE-GMAW&#xff09; 中&#xff0c;对焊枪和旁路电极位置的精确控制是至关重要的。为了这一过程&#xff0c;科研团队提出了安装微型惯性测量单元&#xff08;IMU&#xff09;传感器和摄像头&#xff0c;来记录焊工控制焊枪的移动和微调…

来了!小学生Python创意编程(视频教学版)

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 在最好的年纪&#xff0c;一起来学Python吧&#xff01;本期博主给大家推荐一本适合小学生阅读的书籍&#xff0c;一起来看看吧~ 推荐图书 小学生Python创意编程&#xff08;视频教学版&#xff09; 直达链接&#x…

SOLIDWORKS 2024新功能之钣金和结构系统

达索系统SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了&#xff0c;在SOLIDWORKS 2024版本中钣金和结构系统功能也做了很大的提升。接下来微辰三维带大家一起看看如何使用达索系统SOLIDWORKS 2024钣金和结构系统的一些新功能快速完成相应的设计。 达索系统SOLIDWORKS 2024的…

bugku-web-GET

这里很明显是让用get请求传递一个名为what的参数&#xff0c;这个参数如果为flag&#xff0c;就会输出flag

HBase的Python API(happybase)操作

一、Windows下安装Python库&#xff1a;happybase pip install happybase -i https://pypi.tuna.tsinghua.edu.cn/simple 二、 开启HBase的Thrift服务 想要使用Python API连接HBase&#xff0c;需要开启HBase的Thrift服务。所以&#xff0c;在Linux服务器上&#xff0c;执行如…

(4)(4.3) Kogger Sonar

文章目录 前言 1 推荐硬件 2 配置回声探测仪模块 3 连接ArduPilot硬件 4 参数说明 前言 KOGGER 声纳(KOGGER Sonar)是一款结构紧凑、成本低廉的水下回声测深仪模块&#xff0c;带有 UART 接口&#xff0c;电源电压为 5-14v。 1 推荐硬件 CP210x USB->UART 转换器和安装…

其实StartAI也是一款修图工具 用StartAI修图之“去除背景”

其实StartAI不仅仅是一款AI绘画插件&#xff0c;更是一款可以对我们的摄影图片、广告海报进行修图的AI修图工具。StartAI包含了AI绘画、AI修图等多种复合型AI智能实用工具。 用【背景移除】功能对图片一个背景修图 1.实体广告图片 我们可以通过【背景移除】将广告图中的实体…

在 Windows 11 上安装 MongoDB

MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它提供了灵活的数据存储方案&#xff0c;而 MongoDB Compass 则是一个可视化管理工具&#xff0c;可以更轻松地与 MongoDB 数据库交互和管理。在本文中&#xff0c;我们将介绍如何在 Windows 11 上安装 MongoDB&#xff0c;并配置…

好看又好用,这 10 个宝藏 App 免费拿走不谢!

目录 1. 综合AI工具箱——HuluAI 2. 文本视频生成工具——Jujilu 3.翻译软件 —— TTime 4.专业录屏和直播软件 —— OBS Studio 5.开源跨平台轻量计时软件 —— wnr 6.开源跨平台绘图 —— Drawio 7.开源三维建模动画渲染 —— Blender 8.跨平台的多功能软件 —— Pear…

C 语言贪吃蛇源码解析

贪吃蛇是一款经典的电子游戏&#xff0c;玩家控制一条不断成长的蛇&#xff0c;需要避免撞到自己的身体或者游戏边界&#xff0c;同时吃掉出现在屏幕上的食物以增长身体长度。 下面是一个简单的贪吃蛇游戏的C语言实现&#xff0c;使用了标准输入输出库conio.h和时间库windows.h…

【C++】1323. 扩建花圃问题

问题&#xff1a;1323. 扩建花圃问题 类型&#xff1a;整数运算 题目描述&#xff1a; 梅山小学有一块长方形花圃&#xff08;花圃的长宽都是整数&#xff09;&#xff0c;长 m 米&#xff0c;宽未知。 在修建校园时&#xff0c;花圃的长增加了 n 米&#xff0c;此时发现增加…

Mybatis-获取参数值的两种方式

1. ${ } 和 #{ } MyBatis获取参数值的两种方式&#xff1a;${ } 和 #{ } 对于初学者来说&#xff0c;理解MyBatis中获取参数值的两种方式——#{}和${}&#xff0c;关键在于明白它们如何影响SQL语句的构建以及为何在安全性、灵活性上有显著差异。下面我将用简单易懂的语言来解…