OpenCV 是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。OpenCV-Python为OpenCV提供了Python接口,使得使用者在Python中能够调用C/C++,在保证易读性和运行效率的前提下,实现所需的功能。

一、安装
安装方法有多种,老猿机器上无C++环境,因此直接使用pip安装,OpenCV-Python模块名为opencv-python(在windows下大小写不敏感,其他操作系统没验证),具体安装命令如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

二、加载OpenCV
导入OpenCV 模块指令很简单:

import cv2 as cv

大多数OpenCV 的函数都在cv2模块内,cv2并不是版本2.X的意思,而是因为这个版本是在原cv版本的基础上采用了面向对象编程的方式重新实现,提供了更好的API接口。

三、读取图像文件
3.1、语法:imread(filename,mode)
3.2、参数说明
filename:图像文件名,不同操作系统支撑的文件类型不一样,但都支持bmp图像文件,另外可能还包括jpeg、png、tiff等格式文件
mode:文件读入模式,常用有三种取值
cv.IMREAD_COLOR: 对应值为1,加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
cv.IMREAD_GRAYSCALE:对应值为0,以灰度模式加载图
cv.IMREAD_UNCHANGED:对应值为-1,加载图像,包括alpha通道;
注意:除了这三个常用取值,还可以有多个取值,相关取值及含义如下:

3.3 返回值说明
imread返回一个BGR格式的图像对象,其类型为一个numpy数组。

3.4、案例
img = cv2.imread(r’F:screenpicedflower.jpg’)

注意:
图片文件名不能是中文名,否则识别会报错或不能读入;
imread会去除图像的alpha通道信息
四、显示图像
4.1、调用语法:imshow(title,img)
4.2、参数说明:
title:图像显示窗窗口标题和名字
img:opencv图像对象
imread读入的函数使用imshow即可显示,显示可以给显示窗设定标题,这个标题也是显示窗口的名字,标题不同的imshow会显示不同窗口。标题为一个英文字符串,相同标题的窗口就是同一个窗口。对于窗口,OpenCV提供鼠标及键盘事件处理机制。

imshow的窗口可以通过destroyWindow和destroyAllWindows进行关闭,前者要带窗口的标题,后者是关闭所有由当前程序创建的窗口。

4.3、案例
img = cv2.imread(r’F:screenpicedflower.jpg’)

cv2.imshow(‘img’,img)

五、VideoCapture读取摄像头、图像文件、或视频流
VideoCapture既支持从视频文件(.avi , .mpg格式)读取,也支持直接从摄像机(比如电脑自带摄像头)中读取。要想获取视频需要先创建一个VideoCapture对象,VideoCapture对象的创建方式有以下三种:

调用语法:
VideoCapture(int deviceIndex,int apiPreference = CAP_ANY ):打开摄像头捕获视频。deviceIndex为摄像头序列号,打开缺省摄像头传0,apiPreference 为VideoCapture API后端标识符,老猿没有仔细研究,用缺省值即可

VideoCapture(filename,int apiPreference = CAP_ANY):打开filename指定的文件

更多VideoCapture的内容请参考《opencv学习—VideoCapture 类基础知识》。

下面的代码打开缺省摄像头捕获视频,并将捕获内容显示为窗口视频,并写入视频文件中保存,按q终止退出:

import cv2

def captureVideoFromCamera():

cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)

WIDTH = 1920

HEIGHT = 1920

FILENAME = r’f:videomyvideo.avi’

FPS = 24

cap.set(cv2.CAP_PROP_FPS, 24)

建议使用XVID编码,图像质量和文件大小比较都兼顾的方案

fourcc = cv2.VideoWriter_fourcc(*‘XVID’)

out = cv2.VideoWriter(FILENAME, fourcc=fourcc, fps=FPS,frameSize=(WIDTH,HEIGHT))

if not cap.isOpened():

print(“Cannot open camera”)

exit()

while True:

逐帧捕获

ret, frame = cap.read()

如果正确读取帧,ret为True

if not ret:

print(“Can’t receive frame (stream end?). Exiting …”)

break

frame = cv2.flip(frame, 1) # 水平翻转

ret = out.write(frame)

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

显示结果帧e

cv2.imshow(‘frame’, frame)

if cv2.waitKey(1) == ord(‘q’): break

完成所有操作后,释放捕获器

out.release()

cap.release()

cv2.destroyAllWindows()

captureVideoFromCamera()

六、OpenCV-Python的鼠标事件捕获
OpenCV提供了设置鼠标事件回调函数来提供鼠标事件处理的机制,设置回调函数的方法如下:

cv2.setMouseCallback(winName, OnMouseFunction, param)

其中winName为要设置鼠标回调处理的窗口名,OnMouseFunction为回调函数,用于处理鼠标响应,param为设置回调函数时传入的应用相关特定参数,可以不设置,但需要在回调函数访问设置回调函数对象属性时非常有用。

示例:

cv2.namedWindow(‘image’)

cv2.setMouseCallback(‘image’, draw_circle)

七、waitKey键盘事件处理
openCV提供了快速的键盘处理支持函数waitKey,调用语法:

retval = cv.waitKey( [, delay] )

其中:

delay:等待键盘响应的时间,单位是毫秒,如果为0,则是一直等待到有键盘输入,否则就是等待对应时间还没有输入就超时返回
retval:如果是超时返回-1,否则返回对应键盘按键的ASCII码,但注意对于部分功能键如F1–F10返回值为0,其他功能键老猿未一一测试,可以确认ESC键值可以正常返回(返回值27),Ctrl+c返回3
八、OpenCV的矩形绘制
OpenCV提供了在图像中绘制几何图形的方法,绘制的图像包括矩形、椭圆、扇形、弧等。本文主要介绍矩形的绘制,具体调用语法如下:

rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

其中参数:

img:要显示的图像,为numpy数组,格式为BGR格式
pt1:左上角点的坐标
pt2:右下角点的坐标
color:绘制的颜色,为BGR格式的三元组,如(255,0,0)表示蓝色
thickness:边框的厚度,如果为负数,则该矩形为实心矩形,否则为空心矩形
linetype:线型,包括4连通、8连通以及抗锯齿线型,使用缺省值即可
shift:坐标值的精度,为2就表示精确到小数点后2位
另外该方法还有个变种调用方式:

rectangle(img, rec, color[, thickness[, lineType[, shift]]]),其中的rec为上面pt1和pt2构建的矩形。

除了矩形,OpenCV还支持绘制点、直线、圆、椭圆、文本(不支持中文)等,具体可参考《使用Python OpenCV处理图像之详解直线、圆、矩形及文字的绘制》,老猿就不展开介绍了。

下面的示例代码是打开视频播放,鼠标点击后暂停播放并在点击位置画圆,再次点击恢复播放:

import cv2

def mouseEvent( event, x, y, flags, param):

if event == cv2.EVENT_LBUTTONDOWN:

param[0] = not param[0]

param[1] = (x,y)

def playVideoFile():

cap = cv2.VideoCapture(r’f:videozbl1.mp4’)

fps = 1

eventInf = [False,None]

frame = None

if not cap.isOpened():

print(“Cannot open camera”)

exit()

cv2.namedWindow(‘image’)

cv2.setMouseCallback(‘image’, mouseEvent,eventInf)

while True:

逐帧捕获

pause,mousePos = eventInf

if not pause:

ret, frame = cap.read()

if not ret:

if frame is None :

print(“The video has end.”)

else:

print(“Read video error!”)

break

else:

if mousePos:

cv2.circle(frame, mousePos,60, (255,0,0),2)

cv2.imshow(‘image’, frame)

ch = cv2.waitKey(int(1000/fps))

if ch == ord(‘q’): break

cap.release()

cv2.destroyAllWindows()

playVideoFile()

九、OpenCV的颜色空间转换方法
cv2.cvtColor是openCV提供的颜色空间转换函数,调用语法如下:

cvtColor(src, code, dstCn=None)

其中:

src:要转换的图像
code:转换代码,表示从何种类型的图像转换为何种类型,如下面需要使用的cv2.COLOR_BGR2GRAY就是将BGR格式彩色图像转换成灰度图片,具体转换代码请参考官网文档
dstCn:目标图像的通道数,如果为0表示根据源图像通道数以及转换代码自动确认
更多内容请参考《学习opencv之cvtColor》,示例请参考下面图像阈值处理部分的案例。

十、图像阈值处理
openCV图像的阈值处理又称为二值化,之所以称为二值化,是它可以将一幅图转换为感兴趣的部分(前景)和不感兴趣的部分(背景)。转换时,通常将某个值(即阈值)当作区分处理的标准,通常将超过阈值的像素作为前景。

阈值处理有2种方式,一种是固定阈值方式,又包括多种处理模式,另一种是非固定阈值,由程序根据算法以及给出的最大阈值计算图像合适的阈值,再用这个阈值进行二值化处理,非固定阈值处理时需要在固定阈值处理基础上叠加组合标记。

调用语法:

retval, dst = cv2.threshold (src, thresh, maxval, type)

其中:

src:源图像,8位或32位图像的numpy数组
thresh:阈值,0-255之间的数字,在进行处理时以阈值为边界来设不同的输出
maxval:最大阈值,当使用固定阈值方法时为指定阈值,当叠加标记时为允许最大的阈值,算法必须在小于该值范围内计算合适的阈值
type:处理方式,具体取值及含义如下:
dst:阈值化处理后的结果图像numpy数组,其大小和通道数与源图像相同
retval:叠加cv2.THRESH_OTSU或cv2.THRESH_TRIANGLE标记后返回真正使用的阈值
案例:

ret, mask = cv2.threshold(img, 35, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)

补充说明:

阈值判断时,是以小于等于阈值和大于阈值作为分界条件
如果是32位彩色图像,则是以RGB每个通道的值单独与阈值进行比较,按每个通道进行阈值处理,返回的是一个阈值处理后的RGB各自的值。请参考《OpenCV阈值处理函数threshold处理32位彩色图像的案例》。
下面的代码生成一个图像的掩码图像:

def createImgMask(img):

创建img的掩码

if img is None:return None

if len(img.shape)>=3:

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

else:img2gray = img

ret, mask = cv2.threshold(img2gray, 35, 255, cv2.THRESH_BINARY)

return mask

十一、adaptiveThreshold自适应阈值化图像处理
上面介绍的threshold 函数的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力。图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想的分割效果。在图片中的灰度是不均匀的,所以通常情况下图片中不同区域的阈值是不一样的。这样就需要一种方法根据图像不同区域亮度或灰度分布,计算其局部阈值来进行阈值处理。这种方法就是自适应阈值化图像处理,实际上这可以称为局部阈值法,在OpenCV中的adaptiveThreshold就是这种方法。

调用语法:

adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)

说明:

src:源图像,必须是8位的灰度图
dst:处理后的目标图像,大小和类型与源图像相同
maxValue:用于指定满足条件的像素设定的灰度值
adaptiveMethod:使用的自适应阈值算法,有2种类型ADAPTIVE_THRESH_MEAN_C算法(局部邻域块均值)或ADAPTIVE_THRESH_GAUSSIAN_C(局部邻域块高斯加权和),ADAPTIVE_THRESH_MEAN_C的计算方法是计算出邻域的平均值再减去第六个参数C的值,ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出邻域的高斯均匀值再减去第六个参数C的值。处理边界时使用BORDER_REPLICATE | BORDER_ISOLATED模式
thresholdType:阈值类型,只能是THRESH_BINARY或THRESH_BINARY_INV二者之一,具体参考上面“图像阈值处理”的表格
blockSize:表示邻域块大小,用来计算区域阈值,一般选择3、5、7……
C:表示常数,它是一个从均匀或加权均值提取的常数,通常为正数,但也可以是负数或零
返回值:处理后的图像
补充说明:

亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小
在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓。因此函数adaptiveThreshold除了将灰度图像二值化,也可以进行边缘提取
之所以能进行边缘提取,是因为当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数
当把blockSize设为比较大的值时,如blockSize=21 or 31 or 41时,adaptiveThreshold便是二值化函数
blockSize必须为大于1的奇数(原理老猿还没弄清楚) ,
如果使用平均值方法,平均值mean为180,差值delta为10,maxValue设为255。那么灰度小于170的像素为0,大于等于170的像素为255,如果是反向二值化,灰度小于170的像素为255,大于等于170的像素为0
案例:

import cv2

img = cv2.imread(r’F:screenpic1.jpg’,cv2.IMREAD_GRAYSCALE)

newImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 3, 5)

cv2.imshow(‘img’,img)

cv2.imshow(‘newImg’,newImg)

cv2.waitKey(60000)

运行效果:

源图:

下面是分别设置不同块大小的结果图,左图块大小为31,右图为3:

可以看到blockSize小时,轮廓识别效果明显,而大时,就是一个二值化图像。

十二、OpenCV的图像修复方法
OpenCV中的cv2.inpaint()函数使用插值方法修复图像,调用语法如下:

dst = cv2.inpaint(src,mask, inpaintRadius,flags)

参数含义如下:

src:输入8位1通道或3通道图像
inpaintMask:修复掩码,8位1通道图像。非零像素表示需要修复的区域
dst:输出与src具有相同大小和类型的图像
inpaintRadius:算法考虑的每个点的圆形邻域的半径
flags:修复算法标记,其中INPAINT_NS表示基于Navier-Stokes方法,INPAINT_TELEA表示Alexandru Telea方法。具体方法在此不展开介绍
下面的代码对一个包含亮色Logo的图片进行去Logo处理:

import cv2

def createImgMask(img):

创建img的掩码

if img is None:return None

if len(img.shape)>=3:

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

else:

img2gray = img

ret, mask = cv2.threshold(img2gray, 35, 255, cv2.THRESH_BINARY)

return mask

def delLogFromImg(img):

imgMask = createImgMask(img)

imgMask = cv2.inpaint(img, imgMask , 3, cv2.INPAINT_TELEA)

return imgMask

img1 = cv2.imread(r’F:emplogo.jpg’)

img2 = cv2.imread(r’F:emplogo.jpg’,cv2.IMREAD_GRAYSCALE)

newImg1 = delLogFromImg(img1)

newImg2 = delLogFromImg(img2)

cv2.imshow(‘img1’,img1)

cv2.imshow(‘newImg1’,newImg1)

cv2.imshow(‘img2’,img2)

cv2.imshow(‘newImg2’,newImg2)

cv2.waitKey(60000)

执行截图1:

小结
本文详细介绍了opencv-python的安装、加载图像文件、捕获摄像头、显示图像、鼠标事件捕获、键盘事件处理、几何图像绘制、颜色空间转换、图像阈值处理、图像修复等基础知识,适合开始学习opencv-python的初学者。

关于原文链接
本文在CSDN的“老猿Python”首发,头条号、微信公众号和百家号“老猿Python”转载,由于这些平台对外部链接的限制,文中不能包含外部链接。如果是头条请点击文章底部最下方的“了解更多”跳转CSDN阅读原文,如果是微信公众号请点击文章底部最下方的“阅读原文”跳转CSDN阅读原文,否则请在百度搜索或CSDN搜索中输入"CSDN老猿Python”加文章标题关键字搜寻本文。
————————————————
版权声明:本文为CSDN博主「齐妹爱了爱了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_35713375/article/details/112158783

cv2 imread函数 python_opencv-python图形图像处理入门基础知识相关推荐

  1. python图像处理教程,【图像处理】使用OpenCV+Python进行图像处理入门教程(二)...

    这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2  图像的运算 复杂的 ...

  2. 使用openCV 的cv2.imread函数读取图片找不到路径

    使用openCV 的cv2.imread函数读取图片时出现,找不到图像的问题: 错误如下: 尝试把 \ 换为 /, 或者把 \ 换为 \ 都不可以. 后来发现,是中文路径的问题,将中文路径换为英文路径 ...

  3. Python入门基础知识函数式编程之匿名函数

    今天跟大家分享的是关于学习Python需要了解的入门基础知识.一起看一看吧! 一.Python 简介 Python定义:是一个免费.开源.跨平台.动态.面向对象的编程语言. Python程序的执行(运 ...

  4. 【PaddlePaddle学习笔记】从零开始学习图像分类01——图像处理入门基础

    本系列文章链接 [PaddlePaddle学习笔记]从零开始学习图像分类01--图像处理入门基础 未完待续...... 目录 一.关于图像的几个基本概念 1. 像素及其坐标 2. 图像的四种基本类型 ...

  5. 图像处理入门基础(OpenCV)

    文章目录 图像处理入门基础(OpenCV) 引言 1. OpenCV库基础操作 图像处理的概念与基本操作 图片.GIF.视频 像素:画面中最小的点 分辨率=画面水平方向的像素值 * 画面垂直方向的像素 ...

  6. 数字图像处理与Python实现笔记之基础知识

    数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...

  7. python 图像分析自然纹理方向与粗细代码_数字图像处理与Python实现笔记之基础知识...

    数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...

  8. python笔记基础-Python入门基础知识学习笔记之一

    为什么要写这篇文章? 本人做过Objective-C开发,现在在用C#做WinForm开发.近段时间在学习Python入门基础知识时,发现有很多知识点和Objective-C的不一样.故想通过本文记录 ...

  9. Python培训入门基础知识学什么?

    Python培训基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python培训入门基础知识学什么呢?来看看下面小编 ...

  10. Python入门基础知识学什么?

    Python基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python入门基础知识学什么呢?来看看下面小编的详细介 ...

最新文章

  1. linux环境下 PYTHONPATH添加
  2. plsql查看表空间_最佳实践—PG数据库系统表空间重建
  3. Android---AlertDialog
  4. 什么代码才是线程安全的
  5. Spring-mvc设置@RequestMapping标签更改返回头及@RequestMapping简述
  6. vs设置编码格式_轻松编辑PDF文档的贝茨编码
  7. python随机数生成_Python随机数生成模块random详解
  8. 微软ASP.NET官方网站MVC教程实际操作中的部分问题
  9. 通达信资金净流入公式_资金净流入公式——股票实战技术指标公式研究有缘看本博定多活30年——东方财富网博客...
  10. windows系统迁移,C盘搬家
  11. 蚂蚁的愤怒之源(落日余晖)-终结篇
  12. 本地生活O2O行业已经逐渐渗透到日常生活中
  13. 《大象--Thinking in UML》已经发售!简介及目录
  14. 程序猿麒麟臂打造之路(健身二)
  15. WIFI驱动开发——WIFI支持WPA3连接
  16. HTML边框圆角椭圆原理,CSS3教程:border-radius你以为就是个圆角边框吗?
  17. 用c语言将2048的分数存档,利用C语言实现2048小游戏的方法
  18. Redis——Redis事务性原理
  19. Long类型的数据转换
  20. c语言6行6列元素奇数的个数,C语言任意输入n个整数,分别统计奇数的和.奇数的个数.偶数的和.偶数的个数....

热门文章

  1. 机器学习处理信号分离_【火炉炼AI】机器学习054-用ICA做盲源分离
  2. cad怎么画立体图形教学_立体图形怎么画步骤 找CAD图形中心点的方法步骤图
  3. html5 几何酷站,10个值得学习的HTML5+CSS3视觉特效酷站欣赏
  4. PowerDesigner详细安装教程
  5. 百度网盘怎么设置提取码 百度网盘自定义提取码方法
  6. 垃圾邮件过滤技术发展现状及展望
  7. ubuntu11.10安装sopcast
  8. 深度图像确定目标距离_技术交流一种距离选通水下激光成像系统设计与实验研究...
  9. [iOS] HealthKit 睡眠分析
  10. 在thinkpad sl400上U盘安装centos6.3的过程