最近在作一个钓鱼网站的项目中用到了一个叫opencv的玩意儿,之前没接触过。感受挺新鲜的,并且项目中要用,因此就问了一下度娘(是想Google一下的,显得高大上and专业一点,可是英语水平实在是low),百度百科的解释是这样的(有点专业,读完之后似懂非懂的感受,不过以为这个东西很强势,能够搞一下):OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,能够运行在Linux、Windows、Android和Mac OS操做系统上。它轻量级并且高效——由一系列 C 函数和少许 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的不少通用算法。html
下面咱们就一点一点来学习这个灰常牛逼的东西吧:python
源码下载地址:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.exe/downloadlinux
安装程序:http://jingyan.baidu.com/article/4dc408484c0ec0c8d946f180.htmlgit
源码下载地址:https://github.com/Itseez/opencv/archive/2.4.13.zipgithub
程序安装:http://blog.csdn.net/csqingchen/article/details/43968925算法
一开始在centos上面装(咱们的测试服务器),死活装不上,不知为什么(若是有装上的小伙伴能够分享一下,真是不胜感激),但代码最后是运行在ubuntu上面的,因此就勉为其难的在本身本地装了一个ubuntu的虚拟机来测试代码,之前对什么装软件,配环境这方面重视的不是很够,对于这样的任务一开始我是拒绝的,心中非常恐惧。确实,不会开发的运维终将被淘汰,不会运维的开发也好不到哪里,但是拒绝又有什么用呢。只能硬着头皮上了。毕竟逃避原本就不是什么好的办法!ubuntu
一、 cv2.imread():读入图片,共两个参数 第一个参数为要读入的图片文件名 第二个参数为如何读取图片,包括cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道 注意:若是当你输入的路径是错误的时候,程序也不会报错,只是当时打印的时候值为None 二、cv2.imshow():建立一个窗口显示图片,共两个参数 第一个参数表示窗口名字,能够建立多个窗口中,可是每一个窗口不能重名 第二个参数是读入的图片 三、cv2.waitKey():键盘绑定函数,共一个参数(若是你用的是64位的系统,写成cv2.waitKey(0) & 0xFF) 表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。若是其参数为0,则表示无限期的等待键盘输入 四、cv2.destroyAllWindows():删除创建的所有窗口 五、cv2.destroyWindows():删除指定的窗口 六、cv2.imwrite():保存图片,共两个参数,第一个为保存文件名,第二个为读入图片
下面代码中读入的是什么照片,保存就的到什么照片,----彩色照片(即cv2.IMREAD_COLOR),是灰色照片(即cv2.IMREAD_GRAYSCALE)centos
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 是python最著名的绘图库,它提供了一整套和matlab类似的命令API,十分适合交互式地进行制图。并且也能够方便地将它做为绘图控件,嵌入GUI应用程序中。它的文档至关完备,而且 Gallery页面 中有上百幅缩略图,打开以后都有源程序。所以若是你须要绘制某种类型的图,只须要在这个页面中浏览、复制、粘贴一下,基本上都能搞定。如今先大致的了解下,具体学习我会在后面继续更新出来。。。数组
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()
为了获取视频,必须建立一个VideoCapture对象,它的参数可使设备的索引号(通常笔记本内置摄像头的参数为0,你也能够设置为别的数来选择别的摄像头),固然也可使视频文件的名字服务器
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对象,咱们应该肯定一个输出文件的名字,播放频率和帧也要肯定。
""" __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是:
fourcc = cv2.cv.FOURCC(*'XVID')
可是老是不能正确的录制出视频文件,显示大小为0KB。最后发现是电脑上没有响应的视频解码库致使的,解决办法:
fourcc = cv2.cv.CV_FOURCC("D", "I", "B", " ")
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画几何图形,主要的函数为:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText等
上述几个函数具备以下的相同类型的参数:
一、直线(左上角--右下角)
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()
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv2.circle(img,(447,63), 63, (0,0,255), -1)
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
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))
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX cv2.putText(img,'OpenCV',(10,500), font, 3,(255,255,255),2)
cv2.putText()中第一个参数为背景图片,第二个为文本内容,第三个参数为距离左边框以及上边框的像素数,第四个参数是文本字体的风格,第五个参数是同比例放大的倍数,第六个是组成文本的三原色,最后一个参数是字体加粗度
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()
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
持续更新中。。。。。。。。