OpenCV 简介

表中的内容

  1. 图片介绍
  2. 安装
  3. 输入
  4. 读取图像
  5. 读取视频
  6. 访问网络摄像头
  7. 将图像转换为灰度、模糊、hsv
  8. 边缘检测
  9. 图像膨胀、侵蚀
  10. 裁剪并调整大小
  11. 在图像上绘制形状
  12. 在图像上放置文字
  13. 扭曲透视
  14. 加入图像

图像简介

1_PgwL0ggvAgKT6NiZnb3how
图片来自 qgis.org

像素 是图像的最小单位。它结合了形成图像、视频、文本或我们在计算机显示器上可见的任何内容。

安装

pip install opencv-python

输入

import cv2
cv2.__version__

opencv-python 包中的 cv2.imshow() 函数与 Jupyter/Colab notebook 不兼容。因此,请改用以下函数:

from google.colab.patches import cv2_imshow 
cv2_imshow(img)

读取图像

# import image in img variable
img = cv2.imread('lambo.jpeg')

显示图像

cv2.imshow('Output', img)
cv2.waitKey(0)

如果你不使用waitKey() 函数,那么图像将立即消失,你在屏幕上将看不到任何内容。

在图像消失之前waitKey(x)增加了 x毫秒的延迟。在键盘按下一个键时,它返回该键的 ASCII 值。如果在 x 毫秒过去之前没有按下任何按钮,则返回 -1。waitKey(0) 无限期地等待按下按键。

读取视频

cap = cv2.VideoCapture(VIDEO PATH)
while True:
  success, img = cap.read()
  cv2.imshow('Output', img)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break

变量“ cap ”存储视频。“img”将在每次迭代时从视频中获取下一帧

cv2.waitKey(1) & 0xFF==ord(‘q’)这一行表示 当用户从键盘按下’q’时,我们的视频就会停止。

Colab/Jupyter notebook 将显示视频中的图像序列。

访问网络摄像头

cap = cv2.VideoCapture(0) # id for default webcam = 0

cap.set(3, 640) # width=640, id=3 for width
cap.set(4, 480) # height=480, id=4 for height
cap.set(10, 100) # brightness=100, id=10 for brightness

while True:
    success, img = cap.read()
    cv2.imshow('Output', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Google Colab 是一个云平台,它无法访问你本地系统的网络摄像头,因此上面的代码不会在其上运行。如果你正在使用 Google Colab,请查看此处的链接。

Converting an image into grayscale

将图像转变为灰度

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

使图像模糊

imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)

将图像转换为 HSV 图像

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

边缘检测器:在图像中查找边缘

imgCanny = cv2.Canny(img, 100, 100)

Dialation:增加边缘的厚度

kernel = np.ones((5,5), np.uint8)
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)

1_8UK_E1rYS51F8LxmFFhvFw

侵蚀:减少边缘的厚度

kernel = np.ones((5, 5), np.uint8)
imgEroded = cv2.erode(imgDialation, kernel, iterations=1)

调整大小和裁剪

缩小尺寸:

imgResize = cv2.resize(img, (300, 200))

增加尺寸:

imgResize = cv2.resize(img, (800, 200))

裁剪:

imgCropped = img[0:200, 200:500]

1_hGn0gMA_i77dUWrbzdgO_Q

在图像上绘制正方形

img = np.zeros((512, 512, 3), np.uint8)
img[:] = 255, 0, 0
img[200:300, 200:300] = 0,255,0

1_AgF2vOc3k5WijiOkY7h0IQ
在图像上画线

cv2.line(图像、起点、终点、颜色、粗细)

img = np.zeros((256, 256, 3), np.uint8)
cv2.line(img, (0,0), (100,200), (0,0,255), 3)

1_CKzPzaKfuzonbfL4yXDgeQ
在图像上绘制矩形

cv2.rectangle(图像、起点、终点、颜色、填充矩形或不)

img = np.zeros((256, 256, 3), np.uint8) 
cv2.rectangle(img, (0,0), (200, 150), (0,255,0), cv2.FILLED)

1_j-Prc38hwTtiWI1p1oYpWA

在图像上画圆圈

cv2.circle(图像、中心、半径、颜色、厚度)

img = np.zeros((256, 256, 3), np.uint8) 
cv2.circle(img, (100, 150), 30, (11, 12, 122), 2)

1_pjfVd9jvQ3iqUIJG-aGBvg

在图像上写文字

cv2.putText(图像、文本、起点、字体样式、比例、颜色、粗细)

img = np.zeros((256, 256, 3), np.uint8) 
cv2.putText(img, 'OPENCV', (30,100), cv2.FONT_HERSHEY_COMPLEX, 1, (255,0,0), 1)

1_VV6P59Y5JwlkehGAWJ11Sw
扭曲透视:获取图像的鸟瞰图

透视变换 用于正确对齐图像。参见图片示例:

import numpy as np
import cv2
img = cv2.imread(IMAGE PATH)
width, height = 250, 350
pts1 = np.float32([[111,219],[287,188],[154,482],[352,440]])

pts2 = np.float32([[0,0],[width,0],[0,height],[width, height]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
imgOutput = cv2.warpPerspective(img, matrix, (width, height))
cv2.imshow('img', img)
cv2.imshow('Result', imgOutput)
cv2.waitKey(0)

1_E68e0_UdYTWxPo3tV4RSOg

加入图像

import numpy as np
import cv2
img = cv2.imread(IMAGE PATH)
imgHor = np.hstack((img, img))
imgVer = np.vstack((img, img))
cv2.imshow('Horizontal', imgHor)
cv2.imshow('Vertical', imgVer)
cv2.waitKey(0)

1_8_S2EfmTYb3vI_UpV8qCiQ

对于以上两种方法,图像的通道数应该相同,并且图像不能缩小或放大。

因此,请改用以下功能:


image
现在,使用上述函数连接图像:

import numpy as np
import cv2
img = cv2.imread(IMAGE PATH)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgStack = stackImages(0.5, ([[img, img, img], [img, imgGray, img]]))
# Here, 0.5 is the scale. You can add the scale of your choice
cv2.imshow('Horizontal', imgStack)
cv2.waitKey(0)

1_LXXeQBaxHSHhC3rq8WbVVQ

以上是opencv的一些基本功能。要了解更多信息,请参阅此处的 opencv 官方文档。

感谢阅读

原文作者 Khushijain
原文链接 https://medium.com/analytics-vidhya/introduction-to-opencv-586e38d536fd

推荐阅读
作者信息
AgoraTechnicalTeam
TA 暂未填写个人简介
文章
131
相关专栏
精选文章
82 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和 Agora 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。