2021-02-08

OpenCv学习笔记Day1

  1. Opencv基本了解
    什么是Opencv

​ OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序-----wikipedia。

​Opencv的组成

​ Opencv库有核心模块库Core和扩展模块组成,他们功能如下;

模块 说明
Core 该模块包含 OpenCV 库的基础结构以及基本操作。
Improc 图像处理模块包含基本的图像转换,包括滤波以及类似的卷积操作。
Highgui 在 OpenCV 3.0中,分割为 imcodecs、videoio 以及 highgui 三部分。 这个模块包含可以用来显示图像或者简单的输入的用户交互函数。这可以看作是一个非常轻量级的 Windows UI 工具包。
Video 该模块包含读取和写视频流的函数。
Calib3d 这个模块包括校准单个、双目以及多个相机的算法实现。
Feature2d 这个模块包含用于检测、描述以及匹配特征点的算法。
Objdectect 这个模块包含检测特定目标,比如人脸或者行人的算法。也可以训练检测器并用来检测其他物体。
Ml 机器学习模块本身是一个非常完备的模块,包含大量的机器学习算法实现并且这些算法都能和 OpenCV 的数据类型自然交互。
Flann Flann 的意思是“快速最邻近库”。这个库包含一些你也许不会直接使用的方法,但是其他模块中的函数会调用它在数据集中进行最邻近搜索。
GPU 在 OpenCV 中被分割为多个 cuda* 模块。 GPU 模块主要是函数在 CUDA GPU 上的优化实现,此外,还有一些仅用于 GPU 的功 能。其中一些函数能够返回很好的结果,但是需要足够好的计算资源,如果硬件没有GPU,则不会有什么提升。
Photo 这是一个相当新的模块,包含计算摄影学的一些函数工具。
Stitching 本模块是一个精巧的图像拼接流程实现。这是库中的新功能,但是,就像 Photo 模块一样,这个领域未来预计有很大的增长。
Nonfree OpenCV 包含一些受到专利保护的或者受到使用限制的(比如 SIFT 算法)算法。这些算法被隔离到它们自己的模块中,以表明你需要做一些特殊的工作,才可以在商业产品中使用它们。
Contrib 这个模块包含一些新的、还没有被集成进 OpenCV 库的东西。
Legacy 这个模块包含一些老的尚未被完全取消的东西。
ocl 这是一个较新的模块,可以认为它和 GPU 模块相似,它实现了开放并行编程的 Khronos OpenCL 标准。虽然现在模块的特性比 GPU 模块少很多,但 ocl 模块的目标是提供可以运行在任何 GPU 或者是其他可以搭载 Khronos 的并行设备。这与 GPU 模 块形成了鲜明的对比,后者使用 Nividia CUDA 工具包进行开发,因此只能在 Nividia GPU 设备上工作。

  1. 图像读取

读取图像

​ 使用函数 cv.imread() 读入图像。这幅图像应该在此程序的工作路径(即相对路径), 或者给函数提供完整路径(绝对路径);

​ 第二个参数是要告诉函数应该如何读取这幅图片:
cv.IMREAD_COLOR : 读入一副彩色图像。图像的透明度会被忽略, 这是默认参数,

cv.IMREAD_GRAYSCALE :以灰度模式读入图像,

cv.IMREAD_UNCHANGED : 读入一幅图像,并且包括图像的 alpha 通道

# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv

img = cv.imread('1.jpg',cv.IMREAD_COLOR)  #1

​ Note:你可以用1、0、-1分别代替这个三个标志;

​ **警告:**就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命 令print img时得到的结果是None。
显示图像

​ 使用函数 *cv.imshow()*显示图像。窗口自动适应图像大小(即窗口大小随着图片分辨率的改变而改变)。第一 个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。

cv.imshow('image',img)
	cv.waitKey(0)
	cv.destroyAllWindows()

cv.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果 按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没 有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否 被按下,这个后面我们会接着讨论。

​ *cv.destroyAllWindows()*可以轻易删除任何我们建立的窗口。如果 你想删除特定的窗口可以使用 cv.destroyWindow(),在括号内输入你想删 除的窗口名。
Note:一种特殊的情况是,你可以已经创建了一个窗口,然后将图像加载到其中。在这种情况下,您可以指定窗口是否可调整大小。这是通过函数 **cv.namedWindow()**完成的。缺省情况下,标志为 cv.WINDOW_AUTOSIZE。但是如果你指定cv.WINDOW_NORMAL,你可以调整窗口的大小。当图像尺寸太大时,在窗口中添加跟踪条会很有帮助。

​ 代码如下:

# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv

img = cv.imread('1.jpg',cv.IMREAD_COLOR) 
cv.namedWindow('image', cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

保存图像

​ 使用函数 cv.imwrite() 来保存一个图像。首先需要一个文件名,之后才 是你要保存的图像。

cv.imwrite('1.png',img)

视频流操作

​ 我们知道,视频其实就是有 一帧帧图像快速切换产生的,所有我们可以用读取图片的方法,直接读取它;所不同的是:如果你要播放视频,那么你必须要一直读帧;

​ 同样,在显示帧时,为cv.waitKey()使用适当的时间。如果它太小,视频就会非常快,如果它太高,视频就会很慢(好吧,这就是你如何在慢动作中显示视频)。在正常情况下,25毫秒是可以的。

​ 代码如下:

#所以你的工程目录下应该有一个test.mp4;当然,你也可以用avi视频文件
import numpy as np
import cv2 as cv

cap = cv.VideoCapture('test.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    cv.imshow('frame',frame)
    if cv.waitKey(1) == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

摄像头操作

​ 摄像头读取和视频读取是一样的,摄像头本身从外界读取图像也是有帧数概念的,所有读取摄像头可以看作读取一个无限时长的视频,只不过VideoCapture中放的是具体数值;

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0) #一般电脑内置摄像头为0,你可以通过设置成 1 或者其他的来选择别的摄像头
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # Capture frame-by-frame
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # Our operations on the frame come here
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)#你也可以注释掉这行颜色转换的代码
    # Display the resulting frame
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

保存视频

​ 我们要创建一个 VideoWriter 的对象来保存视频。。我们应该确定一个输出文件 的名字。接下来指定 FourCC 编码(下面会介绍)。播放频率和帧的大小也都 需要确定。最后一个是 isColor 标签。如果是 True,每一帧就是彩色图,否则就是灰度图。

​ FourCC 就是一个 4 字节码,用来确定视频的编码格式。可用的编码列表 可以从 fourcc.org查到。

​ FourCC 码以下面的格式传给程序,以 MJPG 为例:cv.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’)或者 cv.VideoWriter_fourcc(*‘MJPG’)。

​ 代码如下:

#是从摄像头中捕获视频,沿水平方向旋转每一帧并保存它
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    frame = cv.flip(frame, 0)
    # write the flipped frame
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
  1. 绘图

画线

​ 要画一条线,你只需要告诉函数这条线的起点和终点。我们下面会画一条 从左上方到右下角的蓝色线段。

import numpy as np
import cv2 as cv
# Create a black image
img = np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv.line(img,(0,0),(511,511),(255,0,0),5)    #opencv中是BGR
cv.imshow('img', img)
cv.waitKey(0)

​ 具体线的参数,你可以直接看这个函数 cv.line()。

画矩形

​ 要画一个矩形,你需要告诉函数的左上角顶点和右下角顶点的坐标。这次 我们会在图像的右上角话一个绿色的矩形;函数 cv.rectangle()

cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
画圆

​ 要画圆的话,只需要指定圆形的中心点坐标和半径大小。我们在上面的矩 形中画一个圆; cv.circle()

cv.circle(img,(447,63), 63, (0,0,255), -1)
画椭圆

​ 画椭圆比较复杂,我们要多输入几个参数。一个参数是中心点的位置坐标。 下一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。椭圆弧演 顺时针方向起始的角度和结束角度,如果是 0 到360,就是整个椭圆。查看 cv.ellipse() 可以得到更多信息。下面的例子是在图片的中心绘制半个椭圆。

cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
画多边形

​ 画多边形,需要指点每个顶点的坐标。用这些点的坐标构建一个大小等于 行数 X1X2 的数组,行数就是点的数目。这个数组的数据类型必须为 int32。 这里画一个黄色的具有四个顶点的多边形。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

添加文字

​ 要在图片上绘制文字,你需要设置下列参数:

你要绘制的文字

你要绘制的位置 •

字体类型(通过查看 cv.putText() 的文档找到支持的字体)

字体的大小 • 文字的一般属性如颜色,粗细,线条的类型等。

为了更好看一点推荐使用 linetype=cv2.LINE_AA。

在图像上绘制白色的 OpenCV。

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)


查看图像像素信息

​ 你可以用python的方法直接查看图片尺寸

size = img.shape
print(size)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值