Chapter0 - opencv基本操作

本文介绍了在OpenCV中进行基本的图片操作,包括读取、展示图片,图片缩放以及人脸检测的步骤。在读取图片时,返回的是一个矩阵,可以使用numpy进行处理。展示图片时,需要配合imshow函数,并通过waitKey避免窗口卡死。此外,还讲解了如何使用OpenCV进行图片缩放,并提到了人脸检测的过程,涉及级联分类器和面部特征数据的搜索。
摘要由CSDN通过智能技术生成

Chapter0 - opencv基本操作

环境简介

  • 操作系统:Linux-mint-20.03
  • 工具:miniconda3, jupyter-notebook,python=3.8

为了保证独立性,使用miniconda3新建python环境;

以下所有代码都在Jupyter notebook中编写、运行成功;

导入opencvnumpy

import cv2
import numpy as np

读取图片

# read picture
img_colored = cv2.imread("opencv.png", 1) # colored image.
img_gray = cv2.imread("opencv.png", 0)    # Black and white image.

print(img_gray, '\n', type(img_gray), '\n', img_gray.shape)
[[255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 ...
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]] 
 <class 'numpy.ndarray'> 
 (610, 570)

导入的图片显示的像素信息是:689×549,即长度689,高度549;

但是在使用.shape方法时,返回的是矩阵信息,即行×列,就要变成549×689了。

图片读取后的数据类型为np.ndarray,意味着我们可以通过操作numpy、pandas等工具,来操作图像。

print(img_colored, "\nimg_colored.shape:", img_colored.shape)
[[[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 ...

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]] 
img_colored.shape: (610, 570, 3)

如何理解610×570×3

从矩阵的形式来看,有610个"元素",每个元素是570x3维的矩阵;

从图像的角度来看,先按行分割(610),每一行有616列,每列元素都有RGB三种属性,所以是616×3;

展示图片

# show image
cv2.namedWindow("opencv", cv2.WINDOW_AUTOSIZE)
cv2.imshow("opencv", img_gray) # "Penguins": title of image

cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口;

运行结果

img_gray

cv.namedWindow("input",cv.WINDOW_AUTOSIZE)

  • 作用:会先生成一个窗口,这个窗口的顶部栏会加上Penguins这个字样;

  • 配合cv.imshow("Penguins", src),因为这两个的标题是一致的(都为Penguins),所以会放在同一个窗口中显示;如果这两个的标题并不一致,那么会出现两个窗口;

  • 必须配合waitKey()destroyAllWindows()使用!不然会卡死!

  • 其实如果不是特别要求显示效果,namedWindow()选配。

waitKey(time_period)

  • 等待用户事件,使窗口一直保持静态,直到用户在窗口界面随便按一下键盘,窗口才会自动关闭

  • time_period: 单位毫秒ms,如果没有用户操作,在time_peroid毫秒后执行下一步操作;比如这里是cv2.destroyAllWindows(),关闭所有窗口;

  • time_peroid=0代表一直保持窗口静态;

  • 一定要用按键盘退出,而不是手动关闭,不然会一直卡死的

图片缩放

# resize image
img_resized = cv2.resize(img_gray, (600,500))
cv2.imshow("Resized", img_resized)

# resize image to one half
img_resized_half = cv2.resize(img_gray, (int(img_gray.shape[1]/2), int(img_gray.shape[0]/2)))
cv2.imshow("Resized to half", img_resized_half)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果

  • Resized to half
    Resized to half

  • Resized
    Resized

注意

  • 这里的(600, 500)代表图片的长度和高度,而不是矩阵,对应矩阵应该是:500×600;
  • 这里的操作是缩放而不是裁剪

应用举例:用opencv进行人脸检测

检测的大致过程

  • 创建级联分类器(Cascade Classifier),作用是提取面部特征数据,往往使用XML文件来保存面部特征数据;
  • 用OpenCV读取图像,这也是个把图像-->NumPy数组的过程;
  • 结合面部特征数据,对这些数组进行搜索,得到面部矩形的坐标;
  • 使用矩形面框显示图像;

DetectionProcess

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值