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、 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)

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页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览、复制、粘贴一下,基本上都能搞定。现在先大体的了解下,具体学习我会在后面继续更新出来。。。

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,你也可以设置为别的数来选择别的摄像头),当然也可以使视频文件的名字

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绘图操作

学习使用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、直线(左上角--右下角)

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、绘制矩形

cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

3、画圆

cv2.circle(img,(447,63), 63, (0,0,255), -1)

4、椭圆

cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

5、绘制多边形

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、添加文本信息

font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.putText(img,'OpenCV',(10,500), font, 3,(255,255,255),2)

cv2.putText()中第一个参数为背景图片,第二个为文本内容,第三个参数为距离左边框以及上边框的像素数,第四个参数是文本字体的风格,第五个参数是同比例放大的倍数,第六个是组成文本的三原色,最后一个参数是字体加粗度

下图就是这几种图形的一个组合:

二、鼠标事件

1、简单入门

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、跟随鼠标移动进行绘制矩形或者画圆

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

持续更新中。。。。。。。。

opencv 震撼你的视觉-------基础篇的更多相关文章

  1. OpenCV学习(一)基础篇

    OpenCV 2 计算机视觉编程手册读书笔记1 矩阵创建 Mat类是OpenCV中非常有用类,用来创建和操作多维矩阵.可以有很多方法构造它. // 构造函数 //! constructs 2D mat ...

  2. 前端总结·基础篇·CSS(二)视觉

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·CSS(四)兼容 目录 一.动画(animation)(IE ...

  3. OpenCV基础篇之读取显示图片

    程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...

  4. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  5. 前端总结·基础篇·CSS(一)布局

    目录 这是<前端总结·基础篇·CSS>系列的第一篇,主要总结一下布局的基础知识. 一.显示(display) 1.1 盒模型(box-model) 1.2 行内元素(inline) &am ...

  6. 前端总结·基础篇·CSS(三)补充

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 目录 一.移动端 1.1 视口(viewport) 1.2 媒体查询(medi ...

  7. 前端总结·基础篇·JS(一)五大数据类型之字符串(String)

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(二)补充 前端总结·基础篇·JS(一)五大数据类型之字符串(String) 目录 这是& ...

  8. 前端总结·基础篇·JS(二)数组深拷贝、去重以及字符串反序和数组(Array)

    目录 这是<前端总结·基础篇·JS>系列的第二篇,主要总结一下JS数组的使用.技巧以及常用方法. 一.数组使用 1.1 定义数组 1.2 使用数组 1.3 类型检测 二.常用技巧 2.1 ...

  9. 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...

随机推荐

  1. jsonp解决跨域

    ajax请求: $.ajax({        type: "get",//必须使用get方式        async: false,        url: "htt ...

  2. Codeforces Round #172 (Div. 2)

    A. Word Capitalization 模拟. B. Nearest Fraction 枚举. C. Rectangle Puzzle 求出两个矩形的点,套简单多边形的面积交板子. D. Max ...

  3. 使用sublime遇到的问题汇总

    问题一:用GBK编码的文件用Sublime打开出现中文乱码的解决办法: 通过ctrl+shift+p--package control install安装插件"ConvertToUTF8&q ...

  4. 关于Cookie的 工具类

    import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; ...

  5. (转)LINUX测试环境部署Redis(四)

    安装配置Redis 第一部分:安装redis  希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: ...

  6. PHP文件和目录操作-----复制、移动、重命名、删除文件

    PHP通过copy()函数来复制一个文件.用法如下: bool copy(string $source, string $dest) 其中$source是源文件的路径,$dest是目的文件的路径.函数 ...

  7. Android Context 上下文 你必须知道的一切

    本文转载于:http://blog.csdn.net/lmj623565791/article/details/40481055 转载请标明出处:http://blog.csdn.net/lmj623 ...

  8. OpenGL法向量变换

    OpenGL光照开启时,法向量用于决定特定顶点或面上接受到光照的多少.光照处理过程作用于观察坐标空间,因此,模型对象坐标系的法向量也需要使用GL_MODELVIEW矩阵变换到观察坐标系. 然而,法向量 ...

  9. ubuntu系统lamp环境搭建、数据库迁移、设置数据库外部访问

    sudo passwd root设置两次密码su输入设置的密码exit (退出root帐号) 1.sudo apt-get update 2.sudo apt-get install apache2 ...

  10. Python之import

    今天写了一个很简单的111.py文件(模块),用命令行直接import 111报错:syntaxerror:invalid systax 从网上查了一下,原因有如下集中: 1,所导入模块没有sys.p ...