转载:https://www.cnblogs.com/luxiaojun/p/6208538.html
侵权删
不习惯用博客园,难得一篇好文章,转到CSDN上供和我一样的初学者学习
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
|