OpenCV简介
计算机视觉是计算机科学的迷人领域,云计算和强大的GPU和TPU使图像处理更快、更有效。汽车、机器人和无人机已经开始理解图像和视频。人机界面 "计算机视觉 "的重要性将在未来几年内不断增加。
什么是OpenCV?
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。
OpenCV它有C++、C、Python和Java的接口。该库是用优化的C/C++编写,以使用多核处理。当OpenCL被打开时,它可以使用下面的异构计算平台的硬件加速。
OpenCV有超过2500种不同算法的代码! 它可免费用于商业和学校项目。
OpenCV能做什么?
你几乎可以用OpenCV做任何你能想到的计算机视觉任务。
- 内建的数据结构和输入/输出
OpenCV内置了很多用于图像处理和计算机视觉操作的基元。图像、点、矩形等基本结构都已经内置于OpenCV中,且已经针对速度和内存进行了优化。
imgcodecs模块负责打开和保存图像文件。通过简单的命令,你可以在完成后将输出的图像保存为jpg或png文件。当你用相机工作时,你将不得不处理大量的视频文件。你可以轻松地从网络摄像头录制视频,或读取各种格式的视频文件。你还可以设置每秒帧数、帧大小等属性,将一堆帧保存为视频文件。
- 处理图像
当imgproc模块可以做诸如图像过滤、几何变换、形态学操作、在图像上绘图、颜色转换、直方图、运动分析、形状分析、特征检测等等。
- 构建GUI
有一些模块可以制作显示图像和/或视频的窗口。还有等待功能,直到你按下键盘才进入下一步。还可以跟踪鼠标的动作,这在制作交互式应用程序时非常有帮助。你可以在这些输入窗口上画出矩形,然后根据你选择的区域进入下一个步骤。
- 视频分析
视频分析包括弄清事物如何从一帧移动到下一帧,跟踪视频中的不同事物,为视频监控制作模型等。OpenCV也能处理视频的显示和分析。
- 三维重建
使用合适的算法,我们可以从一组二维图像中拼凑出一个三维场景。OpenCV的算法可以通过弄清物体在这些二维图像中的相互关系来弄清它们的三维位置。
- 取出特征
人类的视觉系统倾向于挑选出一个场景中最重要的部分,以便以后能够记住它们。为了做到这一点,人们开始制作 "特征提取器",可以找到图像的这些关键部分。有许多著名的算法,可以在features2d的模块的帮助下找到并提取出来。
- 物体检测
物体检测是弄清物体在图片中的位置的过程。这个过程并不关心它是什么类型的物体。如果你做一个椅子检测器,它将告诉你椅子在图片中的位置。它不会告诉你这把椅子是高背的红色还是低背的蓝色。在许多计算机视觉系统中,弄清事物的位置是一个重要步骤。在本教程中,我们将讨论这个话题,并建立一个能够检测《辛普森一家》系列中人物面孔的算法。
本教程将教你如何快速、轻松地构建令人惊叹的计算机视觉应用。我们首先对图像进行几何变换。然后,我们将研究仿射和投射变换以及如何将它们应用于照片。
本教程还包括用于构建OpenCV应用程序的清晰的Python实例。本教程从图像处理、图像处理、图像映射和图像检测等基本任务开始。它还包括流行的OpenCV库的例子。
本教程教你了解OpenCV的不同功能以及它们是如何实现的。
在这个面向初学者的课程中,你将学到关于OpenCV的所有知识。你将学习从基础知识(如阅读图片和视频,改变图片的外观,以及在图片上写一些文字)到更高级的想法(色彩空间,边缘检测)。最后,你将有一个指南来建立你自己的深度计算机视觉机器人,它将识别和命名不同的卡通人物。
参考资料
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载
安装
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# pip install opencv-contrib-python
# pip install caer
# python
Python 3.9.12 (main, Apr 5 2022, 06:56:58)
[GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.6.0'
openCV-conrib-Python行将安装一个软件包,其中包括主模块中的所有内容以及Python和OpenCV社区提供的贡献模块。
Caer基本上是一组实用的函数,在你的计算机视觉旅程中会被证明是超级有用的。它有一大堆超级有用的辅助函数,可以帮助你加快工作流程。
读取图像和视频
import cv2 as cv
img = cv.imread('/home/andrew/test.png')
cv.imshow('test', img)
cv.waitKey(0)
OpenCV如何显示带有颜色空间的图像
imread函数默认读取的是BGR(蓝-绿-红)格式的图像。通过给imread函数添加额外的标志或模块,我们可以读取不同格式的图像。
-
cv.IMREAD_COLOR将设置图像以其默认颜色加载。
-
cv.IMREAD_GRAYSCALE以灰度加载。
让我们来试试。
import cv2 as cv
img = cv.imread('/home/andrew/test.png', cv.IMREAD_GRAYSCALE)
cv.imshow('test', img)
cv.waitKey(0)
读取视频
import cv2 as cv
capture = cv.VideoCapture('Videos/demo.mp4')
while True:
isTrue, frame = capture.read()
cv.imshow('Video', frame)
if cv.waitKey(20) & 0xFF== ord('d'):
break
capture.release()
cv.destroyAllWindows()
cv.VideoCapture方法要么接受一个整数作为参数,如0、1、2、3等,要么接受一个视频文件的路径。
现在,如果你使用你的网络摄像头或连接到你的计算机的摄像头,你将提供一个整数参数,如0、1或2。也就是说,你是直接从你的相机中读取视频。在大多数情况下,Python将用整数0来引用你的网络摄像头。但是如果你有多个摄像头连接到你的计算机上,你可以通过使用适当的参数来引用它们。例如,0将引用你的网络摄像头,1将引用连接到你的计算机的第一个摄像头,2将引用第二个摄像头,以此类推。
视频读完之后的报错:
File "/home/andrew/demo.py", line 6, in <module>
cv.imshow('Video', frame)
cv2.error: OpenCV(4.6.0) /io/opencv/modules/highgui/src/window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
调整帧的大小和比例
如果你想调整一个图像的大小,你可以通过调整其宽度、高度或两者来实现。也可以在调整后的版本中保留原始图像的长宽比。OpenCV提供了cv.resize()函数来调整图像的大小。
这是cv.resize()函数的语法。
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
- src = 图像或视频的路径
- dsize = 新调整的图像的期望尺寸
- fx = [可选]沿水平轴的系数比例
- fy = [可选]垂直轴的比例因子
- 最后是插值。
插值意味着在其他事物或部分之间的两个已知值之间插入(数据或函数)的估计值。在OpenCV中,它意味着你要插入你正在读取的视频或图像的一小部分。在OpenCV中,有4种类型的插值。
- INTER_NEAREST是一种基于脚本中最近的物体的插值。
- INTER_LINEAR是一种双线性插值,主要在默认情况下使用。
- INTER AREA - 像素区域关系重采样。它可能是一种更好的图像抽取方法,因为它可以消除摩尔纹。然而,当图像被放大时,该方法与INTER NEAREST类似。
- INTER CUBIC - 44像素的邻域双三次插值
- INTER LANCZOS4 - 在一个8x8像素的区域进行Lanczos插值
缩放图像
import cv2 as cv
img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
print('Original Dimensions : ',img.shape)
scale_percent = 40 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dimension = (width, height)
# resize image
resized = cv.resize(img, dimension, interpolation = cv.INTER_AREA)
print('Resized Dimensions : ',resized.shape)
cv.imshow("Resized image", resized)
cv.waitKey(0)
cv.destroyAllWindows()
调整视频的比例
import cv2 as cv
def rescaleFrame (frame, scale=0.25):
width = int(frame.shape [1] * scale)
height = int(frame.shape [0] * scale)
dimensions = (width,height)
return cv.resize (frame, dimensions, interpolation=cv.INTER_AREA)
capture = cv.VideoCapture('Videos/demo.mp4')
while True:
isTrue, frame = capture.read()
frame_resized = rescaleFrame(frame)
cv.imshow('Video', frame)
cv.imshow('Video Resized', frame_resized)
if cv.waitKey(20) & 0xFF==ord('d'):
break
capture.release()
cv.destroyAllWindows
网友评论