opencv python教程简书_Python-OpenCV —— 基本操作一网打尽

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

简言之,通过openCV可实现计算机图像、视频的编辑。广泛应用于图像识别、运动跟踪、机器视觉等领域。

为什么用Python?

众所周知,虽然Python语法简洁,编写高效,但相比C/C++运行慢很多。然而Python还有个重要特性:它是一门胶水语言!Python可以很容易地扩展C/C++。OpenCV-Python就是用Python包装了C++的实现,背后实际就是C++的代码在跑,所以代码的运行速度跟原生C/C++速度一样快,而且更加容易编写。

安装

pip install opencv-python

然后import cv2就可以了

基础操作函数

cv2.imread()——读取图像

函数格式cv2.imread(img,flag)

flag取值可以为

cv2.IMREAD_COLOR 默认、彩色照片

cv2.IMREAD_GRAYSCALE 灰度照片

cv2.IMREAD_UNCHANGED 加载原图通道

也可以通过1、 0、-1 指定上述三个模式

import numpy as np

import cv2

# 灰度模式打开图片

img = cv2.imread('messi5.jpg',0)

cv2.imshow()——显示图片

cv2.imshow('image',img)#第一个为显示的图片名字,第二个为图片

cv2.waitKey(0)#不停刷新图片,直到你按下任意按键退出

cv2.destroyAllWindows()#关闭所有显示框,若只关闭一个,可 cv2.destroyWindow()单独指定

cv2.imwrite()——保存图片

cv2.imwrite('messigray.png',img) #第一个参数为文件名,第二个为要保存的图像。

cv2.VideoCapture()——捕捉视频图像

import numpy as np

import cv2

#创建一个VideoCapture项目,0代表选择第一个设备

cap = cv2.VideoCapture(0)

while(True):

# 捕捉每一帧图像,返回两个参数ret为是否返回图片(True or False),frame为返回的图片

ret, frame = cap.read()

# 通过cv2.cvtColor转换颜色格式为灰度模式

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

# 播放每一帧图像

cv2.imshow('frame',gray)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

# 最后要记得释放capture

cap.release()

cv2.destroyAllWindows()

还可以通过更改设备号为文件名来播放视频,并且通过cv2.WaitKey()来控制播放速度,可以制作慢动作视频等等

import numpy as np

import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):

ret, frame = cap.read()

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

cv2.imshow('frame',gray)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

cap.release()

cv2.destroyAllWindows()

cv2.VideoWriter()——保存视频

import numpy as np

import cv2

cap = cv2.VideoCapture(0)

#fourcc是一种编码格式,我们保存视频时要指定文件名、编码格式、FPS、输出尺寸、颜色模式

fourcc = cv2.VideoWriter_fourcc(*'XVID')

out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):

ret, frame = cap.read()

if ret==True:

#cv2.flip(img,flag) 翻转图像(1水平翻转、0垂直翻转、-1水平垂直翻转)

frame = cv2.flip(frame,0)

# 写入视频帧

out.write(frame)

cv2.imshow('frame',frame)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

else:

break

cap.release()

out.release()

cv2.destroyAllWindows()

cv2.line(), cv2.circle() , cv2.rectangle(), cv2.ellipse(), cv2.putText()

画图,用处较少,不再赘述

cv2.setMouseCallback()——鼠标绘图

import cv2

import numpy as np

#初始化

drawing = False #为真时开始画图

mode = True #为真时画举行,为假时画圆

ix,iy = -1,-1

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

global ix,iy,drawing,mode

#鼠标左键按下时

if event == cv2.EVENT_LBUTTONDOWN:

drawing = True

ix,iy = x,y

#鼠标移动时

elif event == cv2.EVENT_MOUSEMOVE:

if drawing == True:

if mode == True:

cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)

else:

cv2.circle(img,(x,y),5,(0,0,255),-1)

#鼠标抬起时

elif event == cv2.EVENT_LBUTTONUP:

drawing = False

if mode == True:

cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)

else:

cv2.circle(img,(x,y),5,(0,0,255),-1)

#初始化图像

img = np.zeros((512,512,3), np.uint8)

cv2.namedWindow('image')

cv2.setMouseCallback('image',draw_circle)

#按下"m"来切换模式

while(1):

cv2.imshow('image',img)

k = cv2.waitKey(1) & 0xFF

if k == ord('m'):

mode = not mode

elif k == 27:

break

cv2.destroyAllWindows()

array.item()、array.itemset()——查看并修改单一像素值

import cv2

import numpy as np

img = cv2.imread('messi5.jpg')

# 指定像素点

px = img[100,100]

print px

#[157 166 200]

# 获取蓝色像素值

blue = img[100,100,0]

print blue

#157

img.shape img.size img.dtype —— 查看图片尺寸、大小、数据类型

>>> print img.shape

(342, 548, 3)

>>> print img.size

562248

>>> print img.dtype

uint8

cv2.split cv2.merge —— 分离、合并通道(注意:有损分离)

>>> b,g,r = cv2.split(img)

>>> img = cv2.merge((b,g,r))

#或者

>>> b = img[:,:,0]

#也可以通过这种形式快速指定红色通道像素值为0

>>> img[:,:,2] = 0

cv2.copyMakeBorder() —— 给图片加一个相框

可以指定下列参数

src - 你的图片

top, bottom, left, right - 上下左右边框宽度

borderType - 边框类型(下面详细展示,不做具体讲解)

cv2.BORDER_CONSTANT

cv2.BORDER_REFLECT

cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT

cv2.BORDER_REPLICATE

cv2.BORDER_WRAP

value - 当类型为cv2.BORDER_CONSTANT时需要额外指定的值

import cv2

import numpy as np

from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread('opencv_logo.png')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)

reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)

reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)

wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)

constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')

plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')

plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')

plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')

plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')

plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')

plt.show()

885f7992b8fc

如图所示

cv2.inRange —— 用来追踪物体

HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用COLOR_BGR2HSV表示。

经验之谈:OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。

现在,我们实现一个使用HSV来只显示视频中蓝色物体的例子,步骤如下:

捕获视频中的一帧

从BGR转换到HSV

提取蓝色范围的物体

只显示蓝色物体

885f7992b8fc

追踪蓝色物体

capture = cv2.VideoCapture(0)

# 蓝色的范围,不同光照条件下不一样,可灵活调整

lower_blue = np.array([100, 110, 110])

upper_blue = np.array([130, 255, 255])

while(True):

# 1.捕获视频中的一帧

ret, frame = capture.read()

# 2.从BGR转换到HSV

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# 3.inRange():介于lower/upper之间的为白色,其余黑色

mask = cv2.inRange(hsv, lower_blue, upper_blue)

# 4.只保留原图中的蓝色部分

res = cv2.bitwise_and(frame, frame, mask=mask)

cv2.imshow('frame', frame)

cv2.imshow('mask', mask)

cv2.imshow('res', res)

if cv2.waitKey(1) == ord('q'):

break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android listview 数据同步,android中ListView数据刷新时的同步方法

本文实例讲述了android中ListView数据刷新时的同步方法。分享给大家供大家参考。具体实现方法如下:public class Main extends BaseActivity {private static final String TAG "tag";private static final int STATUS_CHANGE 0;ExpandableListView mEl…

python __reduce__魔法方法_Python魔法方法指南

(译)Python魔法方法指南 简介 本指南归纳于我的几个月的博客,主题是 魔法方法 。 什么是魔法方法呢?它们在面向对象的Python的处处皆是。它们是一些可以让你对类添加“魔法”的特殊方法。 它们经常是两个下划线包围来命名的(比如 __init__ &a…

opengles 顶点数组 android,OpenGLES顶点属性、顶点数组和缓冲区对象

顶点属性数据可以用一个顶点数组对每个顶点指定,也可以将一个常量值用于一个图元的所有顶点OpenGLES支持最少16个顶点属性。准确查询顶点数量方法如下:GLint maxVertexAttribs;glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);一、指定顶点…

java 实体类 临时注解_JPA:Java持久层API--配置流程

一、JPA概述1.1 JPA是什么JPA (Java Persistence API) Java持久化API。是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没有实现 关注点: ORM ,标准 概念 (关键字&#xf…

android新架构,Android新架构组件 LifeCycles 简介

一、前言为了使开发者能尽快在 Android 平台上开发出高质量的项目,Android 官方推出了 Android Jetpack 项目,旨在从基础,架构,行为以及界面 4 大方面体系化地为我们提供组件级别的支持。当然,在实际开发过程中&#x…

领域驱动设计 pdf_什么是领域驱动设计?

什么是领域驱动设计?你可能使用领域驱动设计(DDD)开发了一些项目。你可能很满意, 使用领域模型来开发领域业务。并且得意地展示给你的同事看,他们会说“666”。但有的时候你使用领域模型你总觉得哪儿有点不对劲。你会嘀咕你可能遗漏了什么。 …

Android四级缓存,RecyclerView 源码四级缓存原理

入口我们从使用功能上去读取源码,通常的用法是这个样子-> 我们设置layoutmanager,GridLayouManager 继承LinearLayoutManager,所以我们就LinearLayoutManager 为基准查看rv.layoutManager GridLayoutManager(this,5)rv.addItemDecoration…

织梦自定义html文本,织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章...

这篇文章主要为大家详细介绍了织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。有的时候我们需要通过织梦的dede:sql据自定义字段填的文章id获取相关文…

python 杀死子进程_Python:当父异常终止时,如何杀死子进程?

小编典典 呵呵,我昨天自己在研究这个!假设您无法更改子程序: 在Linux上,prctl(PR_SET_PDEATHSIG,...)可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTE…

html评论置顶功能,微信公众号精选留言评论怎么置顶显示?功能在哪里设置?...

微信公众号精选留言怎么置顶?微信公众号留言功能新增了置顶精选留言的设置,那么微信公众号留言功能在哪里设置呢?下文小乐哥给大家介绍一下!微信公众号精选留言怎么置顶?微信公众平台悄然上线了一个新功能,…

python函数增强代码可读性_写Python必须知道的这几个代码技巧!你会吗?

Day09 函数的初始 函数:函数是以功能为导向,一个函数封装一个功能。登录,注册,文件的改的操作。。。 函数减少代码的重复性,增强了代码的可读性; 获取任意一个字符串的元素的个数 s1 "xiaomingxiaoho…

shell脚本发邮件内容html,[转]Shell脚本中发送html邮件的方法

作为运维人员,免不了要编写一些监控脚本,并将监控结果及时的发送出来。那么通过邮件发送是比较常用的一种通知方式了。通常的,如果需要发送的内容是简单的文本文件,那么使用/bin/mailx就可以了,但是如果想要发送更复杂…

learn python app v3_‎App Store 上的“Learn Python and Scratch”

Learn “Python and Scratch Programming” from AI driven coach and satisfy your thirst for knowledge. App offers bite sized videos, quizzes and AI driven coach to help you become smarter and become great. Just 60 minutes a week can help you become great in …

计算机应用基础知识竞赛题,计算机基础知识题库

随着科学技术的进步,计算机已逐渐渗入人们的生活中,相应的计算机知识是需要具备的,那么你对计算机基础知识了解多少呢?以下是由学习啦小编整理关于计算机基础知识题库的内容,希望大家喜欢!计算机基础知识题库一、单选题1、 第一台…

inspect python_python之inspect模块

inspect模块主要提供了四种用处: 1.对是否是模块、框架、函数进行类型检查 2.获取源码 3.获取类或者函数的参数信息 4.解析堆栈 一、type and members 1. inspect.getmembers(object[, predicate]) 第二个参数通常可以根据需要调用如下16个方法; 返回值为…

HTML打开网页拒绝访问,192.168.1.1拒绝访问怎么办?

问:为什么设置路由器时,在浏览器中输入192.168.1.1,结果显示拒绝访问,这个问题怎么解决?答:如果是在设置路由器的时候,登录192.168.1.1被拒绝访问,多半是你自己操作有问题导致的&…

python中goto的用法_python3里用goto

python里用goto也是小Pa最近做的项目里的一个需求。python不像C有自带的goto, 需要用额外的包,目前为止,小pa只看到2个goto的包: 这2个小Pa都下载试用过,goto因为开发的时候比较早,对于python3的支持不太好,不推荐使用…

delphi打印html文件路径,Delphi获取文件名、不带扩展名文件名、文件所在路径、上级文件夹路径的方法...

1.获取不带扩展名的文件名方法,利用ChangeFileExt函数修改传入参数的扩展为空,并不会对文件本身产生变更。ChangeFileExt(ExtractFileName(‘D:\KK\Test\123.txt‘),‘‘); //返回 1232.获取上级文件夹路径的方法。ExtractFileDir(‘D:\KK\Test\‘)‘..‘…

gitlab git clone 输入密码_gitlab1:部署gitlab

1、配置yum源vim /etc/yum.repos.d/gitlab-ce.repo复制以下内容:[gitlab-ce]nameGitlab CE Repositorybaseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/gpgcheck0enabled12、更新本地yum缓存sudo yum makecache3、安装GitLab社区版sudo y…

计算机专业英语第五章ppt,计算机专业英语第五章.ppt

计算机专业英语第五章Background The Internet protocols are the worlds most popular open-system (nonproprietary) protocol suite because they can be used to communicate across any set of interconnected networks and are equally well suited for LAN and WAN comm…