OpenCV 机器视觉入门精选 100 题(附 Python 代码)

Posted AI有道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 机器视觉入门精选 100 题(附 Python 代码)相关的知识,希望对你有一定的参考价值。

重磅干货,第一时间送达

OpenCV 机器视觉入门精选 100 题(附 Python 代码)


如今深度学习的快速发展给计算机视觉注入了前所未有的新活力!其中在计算机图形学和计算机视觉里面最流行的一个库就是 OpenCV。OpenCV 在自动驾驶和仿生机器人当中的应用非常广泛。


而在 2018 年 11 月份,OpenCV 通过 GITHUB 正式发布了 OpenCV 又一个重要里程碑版本 OpenCV 4.0。




https://github.com/yoyoyo-yo/Gasyori100knock


OpenCV 机器视觉入门精选 100 题(附 Python 代码)


极简安装:


作者推荐了 OpenCV 的极简安装方法:


1. 安装 MiniConda



2. 创建虚拟环境并激活


$ conda create python = 3.6  -  n gasyori 100
$ source actiavte gasyori 100


3. 安装包


$ pip install -r requirement.txt


其中,requirement.txt 文件在项目根目录下,下载至命令行所在目录直接运行上述命令即可。


100 题实例:


作者写的 OpenCV 100 题按照从简单到复杂逐一解析,非常适合我们的学习路径。


例如 Q1-10:


OpenCV 机器视觉入门精选 100 题(附 Python 代码)


我们首先来看一个简单的例子。


Q1. 读取图像并按 BGR 顺序更改 RGB


import cv2

# Read image
img = cv2.imread("imori.jpg")
b = img[:, :, 0].copy()
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()

# RGB > BGR
img[:, :, 0] = r
img[:, :, 1] = g
img[:, :, 2] = b

# Save result
cv2.imwrite("out.jpg", img)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 机器视觉入门精选 100 题(附 Python 代码)


例如 Q41-50:


OpenCV 机器视觉入门精选 100 题(附 Python 代码)


我们来看一个稍微复杂的例子。


Q41. Canny边缘检测(步骤1)边缘强度


import cv2
import numpy as np
import matplotlib.pyplot as plt

# Read image
img = cv2.imread("imori.jpg").astype(np.float32)
H, W, C = img.shape

# Gray
gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]

# Gaussian Filter
K_size = 5
sigma = 1.4

## Zero padding
pad = K_size // 2
gau = np.zeros((H + pad*2, W + pad*2), dtype=np.float32)
#gau[pad:pad+H, pad:pad+W] = gray.copy().astype(np.float32)
gau = np.pad(gray, (pad, pad), 'edge')
tmp = gau.copy()

## Kernel
K = np.zeros((K_size, K_size), dtype=np.float32)
for x in range(-pad, -pad+K_size):
   for y in range(-pad, -pad+K_size):
       K[y+pad, x+pad]
= np.exp( -(x**2 + y**2) / (2* (sigma**2)))
K /= (sigma * np.sqrt(2 * np.pi))
K /= K.sum()

for y in range(H):
   for x in range(W):
       gau[pad+y, pad+x]
= np.sum(K * tmp[y:y+K_size, x:x+K_size])

## Sobel vertical
KSV = np.array(((-1., -2., -1.), (0., 0., 0.), (1., 2., 1.)), dtype=np.float32)
## Sobel horizontal
KSH = np.array(((-1., 0., 1.), (-2., 0., 2.), (-1., 0., 1.)), dtype=np.float32)

gau = gau[pad-1:H+pad+1, pad-1:W+pad+1]
fy = np.zeros_like(gau, dtype=np.float32)
fx = np.zeros_like(gau, dtype=np.float32)
K_size = 3
pad = K_size // 2

for y in range(H):
   for x in range(W):
       fy[pad+y, pad+x]
= np.sum(KSV * gau[y:y+K_size, x:x+K_size])
       fx[pad+y, pad+x] = np.sum(KSH * gau[y:y+K_size, x:x+K_size])
       
fx = fx[pad:pad+H, pad:pad+W]
fy = fy[pad:pad+H, pad:pad+W]

# Non-maximum suppression
edge = np.sqrt(np.power(fx, 2) + np.power(fy, 2))
fx[fx == 0] = 1e-5
tan = np.arctan(fy / fx)
## Angle quantization
angle = np.zeros_like(tan, dtype=np.uint8)
angle[np.where((tan > -0.4142) & (tan <= 0.4142))] = 0
angle[np.where((tan > 0.4142) & (tan < 2.4142))] = 45
angle[np.where((tan >= 2.4142) | (tan <= -2.4142))] = 95
angle[np.where((tan > -2.4142) & (tan <= -0.4142))] = 135

out = angle.astype(np.uint8)

# Save result
cv2.imwrite("out.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()


OpenCV 机器视觉入门精选 100 题(附 Python 代码)


项目特色:


该项目最大的特色就是 100 题循序渐进,基本涵盖了 OpenCV 的关键知识点,目前已经更新了前 60 题,后续的会陆续发布。


唯一的缺点是项目语言是日语,稍有不便。但是问题不大,笔者推荐一个方法,可以使用谷歌浏览器自动翻译网页即可。而且,所有的代码都是英文的,不妨碍理解。


如果你正在入门 CV,正在学习 OpenCV,那么这个项目将会是一个不错的从入门到进阶的教程。上手代码,亲自跑一跑结果,希望对大家有所帮助!



【推荐阅读】


以上是关于OpenCV 机器视觉入门精选 100 题(附 Python 代码)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV入门级图像处理教程,从小白到视觉算法工程师

面试官一定会问的几题视觉过关挑战赛 - 附源码

面试官一定会问的几题视觉过关挑战赛 - 附源码

机器视觉案例 AI视觉,手势调节物体尺寸,附python完整代码

机器视觉机器视觉博客汇总

ApacheCN 计算机视觉译文集 20210218 更新