热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

走进OpenCV

介绍OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android

介绍

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持

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

而在 2018 年 11 月份,OpenCV 通过 GITHUB 正式发布了 OpenCV 又一个重要里程碑版本 OpenCV 4.0。今天,就主要介绍一下OpenCV在Python里常用的运用。


环境安装

python版的OpenCV 相对于其他开发语言而言要简单很多,今天就介绍及其简单的安装方式,这种方式也只需要三步就可以完成。


  1. 安装 MiniConda
    MiniConda的地址https://conda.io/miniconda.html
  2. 创建虚拟环境并激活

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

  1. 执行安装包

$ pip install -r requirement.txt

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


下面就简单介绍opencv常用的视觉图像处理算法:


常用图像处理算法

接触过图像处理算法的人大概都知道下面几种常见的图像处理算法。


算法编号算法种类
1频道交换
2灰度化处理
3二值化
4大津二值化
5HSV转换
6减色处理
7平均汇集
8高斯滤波器
9中位数过滤器
10Canny边缘检测
n。。。。。。

关于这方面的算法实在是太多了,今天,就主要讲解俩种,一种稍微简单一点的,一种比较复杂一点的。


  1. 读取图像并按 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()

这是原图
在这里插入图片描述

好了,执行看一下效果。
在这里插入图片描述
接下来看一个稍微复杂的例子。


  1. Canny边缘强度检测

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 // 2for 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 <&#61; 0.4142))] &#61; 0
angle[np.where((tan > 0.4142) & (tan < 2.4142))] &#61; 45
angle[np.where((tan >&#61; 2.4142) | (tan <&#61; -2.4142))] &#61; 95
angle[np.where((tan > -2.4142) & (tan <&#61; -0.4142))] &#61; 135out &#61; angle.astype(np.uint8)# Save result
cv2.imwrite("out.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

这是原图
在这里插入图片描述
好了&#xff0c;执行以下&#xff0c;看一下检测后的效果图。
在这里插入图片描述


总结

好了&#xff0c;OpenCV简单的介绍就到这里了&#xff0c;如果你正在入门 CV&#xff0c;正在学习 OpenCV&#xff0c;希望可以帮助到您&#xff0c;如果写的不好&#xff0c;还请多多指教&#xff0c;接下来&#xff0c;我会深入介绍一下有关OpenCV常用的算法。


推荐阅读
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有