opencv
最近在做一个钓鱼网站的项目中用到了一个叫opencv的玩意儿,以前没接触过。感觉挺新鲜的,而且项目中要用,所以就问了一下度娘(是想Google一下的,显得高大上and专业一点,但是英语水平实在是low),百度百科的解释是这样的(有点专业,读完以后似懂非懂的感觉,不过觉得这个东西很强势,可以搞一下):OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
下面我们就一点一点来学习这个灰常牛逼的东西吧:
Windows下安装
源码下载地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.exe/download
安装程序:http://jingyan.baidu.com/article/4dc408484c0ec0c8d946f180.html
linux下安装
源码下载地址:https://github.com/Itseez/opencv/archive/2.4.13.zip
程序安装:http://blog.csdn.net/csqingchen/article/details/43968925
一开始在centos上面装(我们的测试服务器),死活装不上,不知为何(如果有装上的小伙伴可以分享一下,真是不胜感激),但代码最后是运行在ubuntu上面的,所以就勉为其难的在自己本地装了一个ubuntu的虚拟机来测试代码,以前对什么装软件,配环境这方面重视的不是很够,对于这样的任务一开始我是拒绝的,心中很是恐惧。确实,不会开发的运维终将被淘汰,不会运维的开发也好不到哪里,可是拒绝又有什么用呢。只能硬着头皮上了。毕竟逃避本来就不是什么好的办法!
图片处理
一、主要函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 1 、 cv2.imread():读入图片,共两个参数 第一个参数为要读入的图片文件名 第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道 注意:如果当你输入的路径是错误的时候,程序也不会报错,只是当时打印的时候值为 None 2 、cv2.imshow():创建一个窗口显示图片,共两个参数 第一个参数表示窗口名字,可以创建多个窗口中,但是每个窗口不能重名 第二个参数是读入的图片 3 、cv2.waitKey():键盘绑定函数,共一个参数(如果你用的是 64 位的系统,写成cv2.waitKey( 0 ) & 0xFF ) 表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为 0 ,则表示无限期的等待键盘输入 4 、cv2.destroyAllWindows():删除建立的全部窗口 5 、cv2.destroyWindows():删除指定的窗口 6 、cv2.imwrite():保存图片,共两个参数,第一个为保存文件名,第二个为读入图片 |
效果图如下,确实不错挺新鲜的:
下面代码中读入的是什么照片,保存就的到什么照片,----彩色照片(即cv2.IMREAD_COLOR),是灰色照片(即cv2.IMREAD_GRAYSCALE)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import cv2 img = cv2.imread( 'meizi.png' , cv2.IMREAD_COLOR) # 读入彩色图片 cv2.imshow( 'image' , img) # 建立image窗口显示图片 k = cv2.waitKey( 0 ) # 无限期等待输入 print k if k = = 27 : # 如果输入ESC退出 cv2.destroyAllWindows() elif k = = ord ( 's' ): # 如果输入s,保存 cv2.imwrite( 'test.png' , img) print "OK!" cv2.destroyAllWindows() |
二、结合matplotlib
matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览、复制、粘贴一下,基本上都能搞定。现在先大体的了解下,具体学习我会在后面继续更新出来。。。
1 2 3 4 5 6 7 | import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread( 'meizi.png' ,cv2.IMREAD_UNCHANGED) plt.imshow(img,cmap = 'gray' ,interpolation = 'bicubic' ) plt.xticks([]),plt.yticks([]) plt.show() |
效果图如下(使用matplotlib 显示图片,我们可以对图片做一些处理,例如:缩放、调整位置,保存等的功能):
注意:如下图所示,当我们用opencv加载一个彩色图片,并用matplotlib 显示图片的时候会遇到一些困难
视频文件处理
一、摄像头捕获视频
为了获取视频,必须创建一个VideoCapture对象,它的参数可以使设备的索引号(一般笔记本内置摄像头的参数为0,你也可以设置为别的数来选择别的摄像头),当然也可以使视频文件的名字
1 2 3 4 5 6 7 8 9 10 11 12 | import cv2 cap = cv2.VideoCapture( 0 ) while True : ret,frame = cap.read() print ret gray = cv2.cvtColor(frame,cv2.IMREAD_GRAYSCALE) cv2.imshow( 'frame' ,gray) if cv2.waitKey( 1 ) = = 27 : #按Esc退出 break cap.release() cv2.destroyAllWindows() |
cap.read() 获取一个元祖,元祖中第一个是布尔值,如果帧读取的是正确的,就返回True,反之False。第二个值是一个数组,代表的应该是获取到的视频信息内容吧
cv.CvtColor() 将获取的彩色图像,转换成灰度图像
cv2.imshow() 创建一个窗口显示图片
注意:有时候cap可能不能成功的初始化摄像头设备,这种情况下上面的代码会报错。你可以使用cap.isOpened()来检查是否成功初始化,初始化成功则为True
二、录制保存视频
在我们捕获视频,并对每一帧都进行加工之后我们想要保存这个视频,我们需要创建一个VideoWriter对象,我们应该确定一个输出文件的名字,播放频率和帧也要确定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | """ __author__ = '卢晓军' __date__ = '2016/12/22' __Desc__ = 使用Python借助opencv实现对图像的读取,写入 """ import sys reload (sys) import cv2 import numpy as np sys.setdefaultencoding( 'utf8' ) # 选取摄像头,0为笔记本内置的摄像头,1,2···为外接的摄像头 cap = cv2.VideoCapture( 0 ) # cap.set(3,1080) # cap.set(4,720) # 为保存视频做准备 fourcc = cv2.cv.CV_FOURCC( "D" , "I" , "B" , " " ) # 第三个参数则是镜头快慢的,20为正常,小于二十为慢镜头 out = cv2.VideoWriter( 'output2.avi' , fourcc, 3.0 ,( 640 , 480 )) while True : # 一帧一帧的获取图像 ret,frame = cap.read() if ret = = True : frame = cv2.flip(frame, 1 ) #第二个参数小于1,摄像头是反的,大于等于1是正常的 # 在帧上进行操作 # gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 开始保存视频 out.write(frame) # 显示结果帧 cv2.imshow( "frame" , frame) if cv2.waitKey( 1 ) & 0xFF = = ord ( 'q' ): break else : break # 释放摄像头资源 cap.release() out.release() cv2.destroyAllWindows() |
Fourcc 就是一个4字节码,用来确定视频的编码格式
一开始我是用的fourcc是:
1 | fourcc = cv2.cv.FOURCC( * 'XVID' ) |
但是总是不能正确的录制出视频文件,显示大小为0KB。最后发现是电脑上没有响应的视频解码库导致的,解决办法:
1 | fourcc = cv2.cv.CV_FOURCC( "D" , "I" , "B" , " " ) |
三、从文件中播放视频
1 2 3 4 5 6 7 8 9 10 11 12 13 | import cv2 import numpy as np cap = cv2.VideoCapture( "output2.avi" ) while True : ret, frame = cap.read() if frame = = None : #最后读取完 break cv2.imshow( "capture" , frame) if cv2.waitKey( 120 ) = = 27 : # 按Esc退出 break cap.release() cv2.destroyAllWindows() |
注意:如果cv2.waitKey()中的参数小于1的时候,画面停止,就是属于无限等待输入,输入的频率越快,播放的速度就越快
opencv绘图操作
学习使用OpenCV画几何图形,主要的函数为:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText等
上述几个函数具有如下的相同类型的参数:
- img: 背景图像
- color: 形状的颜色。格式为BGR,是一个元组,如(255,0,0)表示蓝色。如果是灰度图像则只需要传入灰度值。
- thickness:厚度,默认值为1,如果对封闭图形传入-1,则会填充整个图形。
- lineType: 线的类型,默认是8-连通,传入cv2.LINE_AA则是反锯齿,反锯齿在画曲线时看起来会更平滑。
一、画线
1、直线(左上角--右下角)
1 2 3 4 5 6 7 8 | import numpy as np import cv2 img = np.zeros(( 512 , 512 , 3 ), np.uint8) cv2.line(img,( 0 , 0 ),( 511 , 511 ),( 255 , 0 , 0 ), 5 ) cv2.imshow( 'image' ,img) cv2.waitKey( 0 ) cv2.destroyAllWindows() |
2、绘制矩形
1 | cv2.rectangle(img,( 384 , 0 ),( 510 , 128 ),( 0 , 255 , 0 ), 3 ) |
3、画圆
1 | cv2.circle(img,( 447 , 63 ), 63 , ( 0 , 0 , 255 ), - 1 ) |
4、椭圆
1 | cv2.ellipse(img,( 256 , 256 ),( 100 , 50 ), 0 , 0 , 180 , 255 , - 1 ) |
5、绘制多边形
1 2 3 | pts = np.array([[ 10 , 5 ],[ 20 , 30 ],[ 70 , 20 ],[ 50 , 10 ]], np.int32) pts = pts.reshape(( - 1 , 1 , 2 )) img2 = cv2.polylines(img,[pts], True ,( 0 , 255 , 255 )) |
6、添加文本信息
1 2 | font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX cv2.putText(img, 'OpenCV' ,( 10 , 500 ), font, 3 ,( 255 , 255 , 255 ), 2 ) |
cv2.putText()中第一个参数为背景图片,第二个为文本内容,第三个参数为距离左边框以及上边框的像素数,第四个参数是文本字体的风格,第五个参数是同比例放大的倍数,第六个是组成文本的三原色,最后一个参数是字体加粗度
下图就是这几种图形的一个组合:
二、鼠标事件
1、简单入门
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import numpy as np import cv2 events = [i for i in dir (cv2) if 'EVENT' in i] print events def draw_circle(event, x, y, flags, param): if event = = cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img, (x, y), 100 , ( 255 , 0 , 0 ), - 1 ) img = np.zeros(( 512 , 512 , 3 ), np.uint8) cv2.namedWindow( 'image' ) cv2.setMouseCallback( 'image' , draw_circle) while ( True ): cv2.imshow( 'image' , img) if cv2.waitKey( 20 ) & 0xff = = 27 : break cv2.deltroyAllWindows() |
2、跟随鼠标移动进行绘制矩形或者画圆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import numpy as np import cv2 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: print 'left button down' drawing = True ix, iy = x,y #elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON: elif event = = cv2.EVENT_MOUSEMOVE: print 'mouse move' if drawing = = True : if mode = = True : cv2.rectangle(img, (ix, iy), (x,y), ( 0 , 255 , 0 ), - 1 ) else : cv2.circle(img, (x, y), 10 , ( 255 , 0 , 0 ), - 1 ) elif event = = cv2.EVENT_LBUTTONUP: print 'left button up' drawing = False img = np.zeros(( 512 , 512 , 3 ), np.uint8) cv2.namedWindow( 'image' ) cv2.setMouseCallback( 'image' , draw_circle) while ( True ): cv2.imshow( 'image' , img) k = cv2.waitKey( 1 )& 0xff if k = = ord ( 'm' ): print 'you typed key m' mode = not mode elif k = = 27 : break |
持续更新中。。。。。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现