OpenCV官⽅教程中⽂版(ForPython)
cv2.waitKey() 是⼀个键盘绑定函数。需要指出的是它的时间尺度是毫
秒级。函数等待特定的⼏毫秒,看是否有键盘输⼊。特定的⼏毫秒之内,如果 按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运⾏。如果没 有键盘输⼊,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会⽆限
期的等待键盘输⼊。它也可以被⽤来检测特定键是否被按下。
cv2.imwrite('messigray.png',img) 保存图像
5.2 从⽂件中播放视频
cv2.VideoWriter([filename, fourcc, fps, frameSize[, isColor] ])
fourcc – 4-character code of codec used to compress the frames. For example,
CV_FOURCC(’P’,’I’,’M’,’1’) is a MPEG-1 codec, CV_FOURCC(’M’,’J’,’P’,’G’) is
a motion-jpeg codec etc. List of codes can be obtained at Video Codecs by FOURCC page
10.3 按位运算
threshold:固定阈值⼆值化,
ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输⼊图,只能输⼊单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值
maxval: 当像素值超过了阈值(或者⼩于阈值,根据type来决定),所赋予的值
type:⼆值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC;cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
# 加载图像
img1 = cv2.imread('C:/Users/AEC/Desktop/d.png')
img2 = cv2.imread('C:/Users/AEC/Desktop/logo.png')
# I want to put logo on top-left corner, So I create a ROI
cv2.imshow('star',img1)
cv2.imshow('logo',img2)
rows,cols,channels = img2.shape
print(rows,cols,channels)
roi = img1[0:rows, 0:cols ]
cv2.imshow('roi',roi)
# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray,25, 255, cv2.THRESH_BINARY)
cv2.imshow('mask',mask)
mask_inv = cv2.bitwise_not(mask)
cv2.imshow('mask_inv',mask_inv)
# Now black-out the area of logo in ROI
# 取 roi 中与 mask 中不为零的值对应的像素的值,其他值为 0
# 注意这⾥必须有 mask=mask 或者 mask=mask_inv, 其中的 mask= 不能忽略
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
cv2.imshow('img1_bg',img1_bg)
# 取 roi 中与 mask_inv 中不为零的值对应的像素的值,其他值为 0。
# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
cv2.imshow('img2_fg',img2_fg)
# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg)
cv2.imshow('dst',dst)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
13.2 物体跟踪
cv2.inRange函数设阈值,去除背景部分
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,
函数很简单,参数有三个
第⼀个参数:hsv指的是原图
第⼆个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
第三个参数:upper_red指的是图像中⾼于这个upper_red的值,图像值变为0
⽽在lower_red~upper_red之间的值变成255
这⾥⼀定需要注意的的问题是 这是hsv格式的图⽚
⾊调H
⽤⾓度度量,取值范围为0°~360°,从红⾊开始按逆时针⽅向计算,红⾊为0°,绿⾊为120°,蓝⾊为240°。它们的补⾊是:黄⾊为60°,青⾊为180°,品红为300°;python官方文档中文版
饱和度S
饱和度S表⽰颜⾊接近光谱⾊的程度。⼀种颜⾊,可以看成是某种光谱⾊与⽩⾊混合的结果。其中光谱⾊所占的⽐例愈⼤,颜⾊接近光谱⾊的程度就愈⾼,颜⾊的饱和度也就愈⾼。饱和度⾼,颜⾊则深⽽
艳。光谱⾊的⽩光成分为0,饱和度达到最⾼。通常取值范围为0%~100%,值越⼤,颜⾊越饱和。
明度V
明度表⽰颜⾊明亮的程度,对于光源⾊,明度值与发光体的光亮度有关;对于物体⾊,此值和物体的透射⽐或反射⽐有关。通常取值范围为0%(⿊)到100%(⽩)。
cap=cv2.VideoCapture('C:/Users/AEC/Desktop/VIDEO0077.mkv')
img = cv2.imread('C:/Users/AEC/Desktop/1550668243(1).png')
print(img)
print(img.shape)
while(1):
# 获取每⼀帧
ret,ad()
# 转换到 HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
# 设定红⾊的阈值
lower_red=np.array([160,0,0])
upper_red=np.array([360,255,255])
# 根据阈值构建掩模
mask=cv2.inRange(hsv,lower_blue,upper_blue)
# 对原图像和掩模进⾏位运算
res=cv2.bitwise_and(frame,frame,mask=mask)
# 显⽰图像
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k=cv2.waitKey(100)&0xFF
if k==27:
break
# 关闭窗⼝
cv2.destroyAllWindows()
⽤保温杯测试的识别效果
不得不说掩模运算这个东西真的好神奇啊!
13.3 到跟踪对象的HSV值
函数 cv2.cvtColor() 也可以⽤到这⾥。但是现在你要传⼊的参数是(你想要 的)BGR 值⽽不是⼀副图。例如,我们要到绿⾊的HSV 值,我们只需在终 端输⼊以下命令:
# -*- coding: utf-8 -*-
"""
Created on Fri Jan 10 20:34:29 2014
@author: duan
"""
import cv2
import numpy as np
green=np.uint8([0,255,0])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
error: /builddir/build/BUILD/opencv-2.4.6.1/
modules/imgproc/src/color.cpp:3541:
error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)
in function cvtColor
#scn (the number of channels of the source),
#i.e. self.img.channels(), is neither 3 nor 4.
#
#depth (of the source),
#i.e. self.img.depth(), is neither CV_8U nor CV_32F.
# 所以不能⽤ [0,255,0],⽽要⽤ [[[0,255,0]]]
# 这⾥的三层括号应该分别对应于 cvArray,cvMat,IplImage
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[60 255 255]]]
现在你可以分别⽤ [H-100,100,100] 和 [H+100,255,255] 做上
下阈值。除了这个⽅法之外,你可以使⽤任何其他图像编辑软件(例如 GIMP)
或者在线转换软件到相应的 HSV 值,但是最后别忘了调节 HSV 的范围。
14 ⼏何变换
缩放 size(src, dsize[, dst[, fx[, fy[, interpolation ] ] ] ]) → dst
平移 cv2.warpAffine()
旋转 RotationMatrix2D
仿射变换 AffineTransform + cv2.warpAffine
透视变换 PerspectiveTransform() +cv2.warpAffine
15 图像阈值
阈值分割处理主要是根据灰度值信息提取前景,所以对前景物体与背景有较强对⽐度的图像的分割特别有⽤。对对⽐度很弱的图像进⾏阈值分割,需要先进⾏图像的对⽐度增强,然后再进⾏阈值处理。下⾯介绍两种常⽤的阈值分割技术:全局阈值分割和⾃适应局部阈值分割
全局阈值分割
1 Ostu算法 前景与背景灰度平均值差距⼤ 处理效果⽐2,3更好
2 熵算法 ⾃动计算阈值 不满⾜双峰图像也适⽤
3直⽅图技术法 前景与背景对⽐明显的图像包含双峰 处理效果较好
局部阈值分割 (如受光照不均变化影响)
1⾃适应阈值算法 不均匀照明或者灰度分布不均效果好
1 ostu⼆值化 算法原理
我写了⼀个python程序,实现这个算法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论