前言

在了解基本的python语法后,我们终于可以开始进行一些项目的实践学习。这里 用opencv进行第一个python项目的上手。 这里我将会分享自己寒假对于opencv的学习


一、安装开发环境

推荐大家使用pycharm!!非常好用。如果之前学习python的话可以 直接在官网下载pycharm。

https://www.jetbrains.com/pycharm/。这个是pycharm官网,如果下载速度过慢,可以去找现有的安装包,记得配置好环境变量,下载时也不要分配给系统默认的文件中,通常来说这个系统分配文件修改都需要管理员权限。

记住 update   PATH variable 一定要打上钩,否则就要自己去配置环境变量。

这里我现在使用的 环境是anaconda。也比较推荐在python进阶阶段、项目阶段的同学们使用这个环境。因为anaconda可以做到 python解释器的版本切换 ,有些项目并不是说 python的解释器越高越好,打个比方有些 库 or 第三方文件只支持早期版本这时候你就得要 重新下载一个python 解释器,来重新配置一个环境 而在anaconda环境中 可以直接创建新的虚拟环境来切换,非常方便。而且anaconda安装的同时,已经配置了许多的第三方库,足够我们的使用。

也推荐官网安装。如果网速过慢,也可以在博客上搜索共享的安装包。

建议两个都选上。

然后在pycharm上settings中 打开interrupt 配置anaconda的解释器就可,说白了就是找到python.exe文件即可

我安装opencv python的方法是从官网上下载whl 文件配置

因为pip 的方法只能配置 3.5一下的opencv —python

如果官网过慢的话

https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/
清华源官网 下载比较快 cp38 的意思是支持解释器 py3.8版本。

这里我们选择 win amd64位

根据操作系统是几位来选择 32 64

将文件下载到 C:\anaconda3\Lib\site-packages,其实就是找到自己安装环境那个文件夹中site—packages。

用Windows+R 打开cmd

输入 python,再import cv2,如果这里没有报错就证明已经再开发环境中安装好了opencv库。

二、简单介绍

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。
这里我们主要学习由python来实现一下,一些基于opencv的简单项目

这里呢,我学习opencv-python 主要用的书是《OPENCV3计算机视觉 PYthon语言实现》,还有各位大佬GitHub以及博客上的各种分享。

首先,opencv作为一个九几年就开源的软件库以及开源社区,在经历了多年,拥有无私开源精神的程序员们的分享下,内置了许多图像处理以及计算机视觉方面的库。

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 3.0 中,被移到 opencv_contrib/xfeatures2d。

OpenCV 包含一些受到专利保护的或者受到使用限制的(比如 SIFT 算法)算法。这些算法被隔离到它们自己的模块中,以表明你需要做一些特殊的工作,才可以在商业产品中使用它们。

Contrib 在 OpenCV 3.0 中,融合进了 opencv_contrib。

这个模块包含一些新的、还没有被集成进 OpenCV 库的东西。

Legacy 在 OpenCV 3.0 中,被取消。

这个模块包含一些老的尚未被完全取消的东西。

ocl 在OpenCV 3.0 中,被取消,取而代之的是 T-API。

这是一个较新的模块,可以认为它和 GPU 模块相似,它实现了开放并行编程的 Khronos OpenCL 标准。虽然现在模块的特性比 GPU 模块少很多,但 ocl 模块的目标是提供可以运行在任何 GPU 或者是其他可以搭载 Khronos 的并行设备。这与 GPU 模 块形成了鲜明的对比,后者使用 Nividia CUDA 工具包进行开发,因此只能在 Nividia GPU 设备上工作。

2.图像处理的简单原理

完整的图像处理程序通常可以分为以下三个步骤:

读取图像,图像的获取可以有多种不同的来源(相机、视频流、磁盘、在线资源),因此图像的读取可能涉及多个函数,以便可以从不同的来源读取图像;
图像处理,通过应用图像处理技术来处理图像,以实现所需的功能(例如,检测图像中的猫);
显示结果,将图像处理完成后的结果以人类可读的方式进行呈现(例如,在图像中绘制边界框,有时也可能需要将其保存到磁盘)。

此外,上述第2步图像处理可以进一步分为三个不同的处理级别:

低层处理(或者在不引起歧义的情况下可以称为预处理),通常将一个图像作为输入,然后输出另一个图像。可在此步骤中应用的步骤包括但不限于以下方法:噪声消除、图像锐化、光照归一化以及透视校正等;
中层处理:是将预处理后的图像提取其主要特征(例如采用 DNN 模型得到的图像特征),输出某种形式的图像表示,它提取了用于图像进一步处理的主要特征。
高层处理:接受中层处理得到的图像特征并输出最终结果。例如,处理的输出可以是检测到的人脸.

原文链接:https://blog.csdn.net/LOVEmy134611/article/details/119489496

这里的内容是引用 博客主 盼小辉的,想看可以用这个链接去看看原文。

这里我自己的理解就是,处理器从I/O接口中获取图片信息进行简单的加工,这是底层处理(预处理)。而中层处理则是将预处理后的图像提取关键数据。(在计算机视觉与图像处理中,很需要运用到线性代数的知识)然后对于高层,打个比方例如检查一只狗。在深度学习中,训练一个检测狗的模型,可能需要几百张图片的训练才能让其变准确。高层将中层所提取的数据放入模型中检查然后准确输出结果。

而像素、颜色、通道、图像和颜色空间
在表示图像时,有多种不同的颜色模型,但最常见的是红、绿、蓝 (RGB) 模型。
RGB 模型是一种加法颜色模型,其中原色 (在RGB模型中,原色是红色 R、绿色 G 和蓝色 B) 混合在一起就可以用来表示广泛的颜色范围。
每个原色 (R, G, B) 通常表示一个通道,其取值范围为[0, 255]内的整数值。因此,每个通道有共256个可能的离散值,其对应于用于表示颜色通道值的总比特数 (2 8 = 256 2^8=2562 
8
 =256)。此外,由于有三个不同的通道,使用 RGB 模型表示的图像称为24位色深图像:

通过调节这三个数值,可以变换出你想要的颜色

图像描述
图像可以描述为2D函数 f ( x , y ) f(x, y)f(x,y),其中 ( x , y ) (x, y)(x,y) 是空间坐标,而 f ( x , y ) f(x, y)f(x,y) 是图像在点 ( x , y ) (x, y)(x,y) 处的亮度或灰度或颜色值。另外,当f(x, y)和(x, y)值都是有限离散量时,该图像也被称为数字图像,此时:

x ∈ [ 0 , h − 1 ] x∈ [0, h-1]x∈[0,h−1],其中 h hh 是图像的高度
y ∈ [ 0 , w − 1 ] y∈ [0, w-1]y∈[0,w−1],其中 w ww 是图像的宽度
f ( x , y ) ∈ [ 0 , L − 1 ] f(x, y)∈ [0,L-1]f(x,y)∈[0,L−1],其中 L = 256 L=256L=256 (对于8位灰度图像)
彩色图像也可以用同样的方式表示,只是我们需要定义三个函数来分别表示红色、绿色和蓝色值。这三个单独的函数中的每一个都遵循与为灰度图像定义的 f ( x , y ) f(x, y)f(x,y) 函数相同的公式。我们将这三个函数的子索引 R、G 和 B 分别表示为 f R ( x , y ) f_R(x, y)f 
R

 (x,y)、f G ( x , y ) f_G(x, y)f 
G

 (x,y) 和 f B ( x , y ) f_B(x, y)f 
B

 (x,y)。
同样,黑白图像也可以表示为相同的形式,其仅需要一个函数来表示图像,且 f ( x , y ) f(x, y)f(x,y) 只能取两个值。通常,0 表示黑色、1 表示白色。
这里我也引用了博客主盼小辉 的文章内容,大家看看就行。

接下来开始对cv在python应用的学习


三、opencv的I/O读与写

首先我们找到一张图片放置在你项目文件中,如果大家对 opencv的API并不熟悉,还是建议大家,使用图像的绝对路径,例如windows下的绝对路径为C:\user\(这里是你的此电脑用户名)\(图片)。如果不是很明白的话,有个简单粗暴的方法,将图片放在此项目的文件夹下,这叫做相对路径。

如上图的Taylor.jiff

然后呢 opencv中的读写函数是

cv2.imread()//读
cv2.imwrite()// 写

例如

import cv2 as cv  #cv2的读写是BGR模式
img=cv.imread('Taylor.jpg')#这张图是存在于当前目录下
print(img) #打印结果是一个numpy结构的矩阵

 对于一个oepncv图像在python中其数据类型是.array类型的二维或者三维数组。

在后面我们也能知道,在分析图片我们一般会先将其转化成 灰度图。

四、阈值操作

看下面代码。cv2.threshold 这个函数 第一个参数是图片,最好是单通道的图片,第二个参数 127 是阈值,255 则是 最大值,最后一个参数二值化操作类型

像下面这段代码则是将小于 127 的像素值 取0,大于127的像素值 取255.

结果如图

import cv2 as cv
import numpy as np
img=cv.imread('Taylor.jpg')
a,ret=cv2.threshold(img,127,255,cv.THRESH_BINARY)#我们只需要这个阈值函数的第二个返回值
def cv_show(name,img):   #自定义的窗口显示函数cv.imshow(name,img)cv2.waitKey(0)cv_show("im",ret) #阈值处理后

  值得我们注意的是 thresold 这个函数的第四个参数,type的类型决定了二值化操作,有以下五种类型

cv2.THRESH_TOZERO_INV

cv2.THRESH_BINARY 超过阈值的部分取最大值(255),其余部分 取0

cv2.THRESH_BINARY_INV 上面那个函数的反转,即未超过取0,其余部分取255

cv2.THRESH_TRUNC 大于阈值设置为阈值,否则不变

cv2.THRESH_TOZERO 大于阈值部分不改变,否则为0

cv2.THRESH_TOZERO_INV 上面那个函数的反转

五、图像平滑处理

1、均值滤波

其原理是对图像进行一个卷积操作

看代码

import cv2 as cv
import numpy as np
img=cv.imread('Taylor.jpg')
img1=cv.blur(img,(3,3))# 这个cv函数就是对图像进行均值滤波处理(卷积操作),目的是使图像色泽更加均匀,第一个参数表示 数据,第二个是卷积内容
a,ret=cv2.threshold(img,127,255,cv.THRESH_BINARY)#我们只需要这个阈值函数的第二个返回值
def cv_show(name,img):   #自定义的窗口显示函数cv.imshow(name,img)cv2.waitKey(0)cv_show("img1",ret) #阈值处理后

2.方框滤波

cv2.boxerFilter(img,-1,(3,3),nomralize=true) #方框滤波函数 使用方法和均值滤波函数差不多

值得一提 第四个参数是归一化, 使用参数true 和均值滤波是一样的

如果指定 nomralize 为 false ,越界值会直接取255

3.高斯滤波

cv.getGaussianblur(img,(3,3),1) #服从 高斯分布 中间值占比较大,值得注意的是前两个参数。

六、形态学 腐蚀操作与膨胀操作

对于 这部分的理解 ,其实腐蚀和膨胀操作在图像处理很常见。

膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。

腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。

腐蚀,我们用到的是erode这个函数,它拥有三个参数,我们这里说一说他的第二个参数

第二个参数范围越大 腐蚀效果越强,而迭代次数越多腐蚀效果也越强

import cv2 as cv
import numpy as np
def cv_show(name,img):   #自定义的窗口显示函数cv.imshow(name,img)cv2.waitKey(0)
img=cv.imread('Taylor.jpg')
kernel=np.ones((5,5),np.uint8)#
img1=cv.erode(img,kernel,iterations=1)#第三个参数代表迭代次数
cv_show("ww",img)# 自定义的显示函数

膨胀

import cv2 as cv
import numpy as np
def cv_show(name,img):   #自定义的窗口显示函数cv.imshow(name,img)cv2.waitKey(0)
img=cv.imread('Taylor.jpg')
kernel=np.ones((5,5),np.uint8)#
img1=cv.dilate(img,kernel,iterations=1)#第三个参数代表迭代次数
cv_show("ww",img)# 自定义的显示函数

开运算与闭运算,所谓开运算 即,先进行腐蚀操作,在进行膨胀操作

而 闭运算 则相反

这个操作所用函数为

cv.morphologyex().

看代码

import cv2 as cv
import numpy as np
def cv_show(name,img):   #自定义的窗口显示函数cv.imshow(name,img)cv2.waitKey(0)
img=cv.imread('Taylor.jpg')
kernel=np.ones((5,5),np.uint8)#
img1=cv2.morphologyEX(img,cv.MORPH_CLOSE,kernel)'''重点注意第二个参数 cv.MORPG_OPEN 表示开运算,代码中的则表示闭运算'''
cv_show("ww",img)# 自定义的显示函数

梯度运算

则是用膨胀的值减去腐蚀的值

我们只需要改变morphology中的二个参数,改为cv.MORPH.GRADIENT即可

概述:利用Sobel算子进行图像梯度计算
参数:

src:输入图像
ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3。
计算时记得 gx gy分开算

 使用cv2.convertScaleAbs()函数进行相加即可

五、项目开始,用opencv python 写出一个带有数字识别功能的程序

总结

这是简易版本,后续有更复杂版本

from aip import AipOcr  # 百度的数字识别库
import cv2 as cv  # opencv python
import osdef cv_show(name, img):  # 自定义的窗口显示函数cv.imshow(name, img)cv.waitKey(0)img = cv.imread('number.jpg')
a, img2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)  # 阈值转化
cv.imwrite('review.jpg',img2)
cv_show("BEFORE", img2)""" 你的 APPID AK SK """  # 百度 api接口
APP_ID = '25565754'
API_KEY = 'dhIEGfuqPfkwebyMZ0Cw8TcX'
SECRET_KEY = 'dY4AC6f7BcIT0NGh011YbX9oTLzRhKAR'  # 百度控制台
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()
list=os.listdir("C:\pythonfile\pythonProject3")
print(list)
a=input("输入处理文件:")
image = get_file_content(a)
result=client.basicGeneral(image);
print(result)

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

基于python的opencv的学习相关推荐

  1. ubuntu16.04安装python.h_ubuntu16.04 下基于 Python 的 OpenCV 的安装

    ubuntu16.04 下基于 Python 的 OpenCV 的安装 这几天一直在学习基于 Python 的 OpenCV , 开发环境是在 Ubuntu16.04 下, 学习的心得就是基于 Pyt ...

  2. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  3. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  4. cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  5. 基于python和Opencv将多张图片结合为一张图片的办法

    基于python和Opencv将多张图片结合为一张图片的办法 需要用到的python包 代码本体 这两天写结课论文,需要做一个好看一点的图,要把多张图片结合为同一张图片,本来想用ps,但是懒,干脆用代 ...

  6. 基于python的数字图像处理--学习笔记(三)

    基于python的数字图像处理--学习笔记(三) 前言 一.灰度拉伸 二.幂律(伽马)变换 三.对数变换 前言 进入冈萨雷斯的第三章内容,并用python实现功能.我更改了代码源,之前找到太烂了,代码 ...

  7. 基于Python与OpenCV的纸质票自动统计功能的实现(一)界面编程

    基于Python与OpenCV的纸质票自动统计功能的实现(一)--界面编程 作为一个资深的自动化工程师,界面编程对我来说太熟悉不过了,但是当时用的都是工业界面编程软件,比如WINCC.组态王等等,在这 ...

  8. 基于Python和OpenCV的面积计算

    基于Python和OpenCV的面积计算 import cv2 import numpy as npimage1 = cv2.imread("F:\\Python\\Image\\1.png ...

  9. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

    实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...

最新文章

  1. 8月书讯 | 像大师级程序员一样思考​
  2. acronym与abbr
  3. Java Servlet完全教程
  4. Error ./include/caffe/util/mkl_alternate.hpp:11:19: fatal error: cblas.h: 没有那个文件或目录...
  5. Ubuntu用户设置文件说明
  6. Linux Restart PHP
  7. 阿里P7/P8学习路线图——技术封神之路
  8. c语言是静态语言python语言是脚本语言对吗_初中生想学编程,请问先学C语言好还是先学Python?...
  9. python中module的意思_python中module的意思
  10. 深入Java核心 Java内存分配原理精讲(3)
  11. linux的mount命令详解
  12. BeetleX.WebFamily之Markdown编辑器
  13. [vue-element]有阅读过ElementUI的源码吗?
  14. Java中 break continue return 的区别
  15. 后疫情时代,这家良心国货,是怎么对自己下狠手的?
  16. 状态监测与故障智能诊断技术在能源动力机械内燃机的应用
  17. 陈俊龙:从深度强化学习到宽度强化学习—结构,算法,机遇及挑战
  18. Microsoft SQL Server 生成随机数字、字符串、日期、验证码以及 UUID
  19. 高清沉浸式体验:基于 RTC 的全景 8K@120fps FoV 实践
  20. Justinmind,为移动设计而生

热门文章

  1. 使用 Springboot websocket 实现聊天室
  2. 就这?阿里p6的面试竟然这么简单
  3. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》导读
  4. 用c语言写抽奖大转盘,iOS抽奖大转盘的二种实现方法
  5. 小程序1rpx,边框不完整或线条太粗
  6. python坐标轴的粗细设置
  7. Holt 线性趋势模型,指数趋势模型和阻尼形式
  8. 软件工程师-华为机试注意事项
  9. bryntum gantt 5.0.6
  10. 生产订单的计划、实际成本与产出查看