今天把几天前的一个程序改进,并注释了一下:
"""
环境womdows pycharm2017
功能:识别蓝色,并输出蓝色识别成功
日期2019年6月14号
"""
import numpy as np # 导入科学计数包
import cv2 # 导入opencv模块
def yanseshibie(): # 创建一个函数,函数名随意定义
green_val = 114
# 从网络摄像头捕获视频
cap = cv2.VideoCapture(0) # 这个括号里的数字应该是相机编号
while (True):
# 逐帧捕获
ret, frame = cap.read()#ret没用到ret可以填写为_,frame
cv2.imshow("original", frame)#输出视频每一帧
# 将这一帧图像BGR转换为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 这一帧图像限定在HSV蓝色的范围
blue_lower = np.array([green_val - 10, 100, 100])
blue_upper = np.array([green_val + 10, 255, 255])
# 阈值HSV图像以仅获得所选颜色,将图像二值化
#就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
# Bitwise-AND屏蔽原始图像
blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
# 结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 形态学结束
blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
# 转换为黑白图像
blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
(thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 计算像素变化
blue_black = cv2.countNonZero(blue_bw)
if blue_black > 18000:
print("视频中有蓝色像素")
else:
print("无蓝色")
# 显示结果帧
cv2.imshow('blue_quyu', blue_bw)
# 按q退出
if cv2.waitKey(3) & 0xFF == ord('q'):
break
# 完成所有操作后,释放捕获
cap.release()
#释放所有窗口
cv2.destroyAllWindows()
if __name__ == "__main__":
yanseshibie()
下面吧一些容易犯错误的地方记录一下:
# 阈值HSV图像以仅获得所选颜色,将图像二值化
#就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
其实就是将图像二值化,将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255。
# Bitwise-AND屏蔽原始图像
blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
# 结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
第一个参数shape:表示内核的形状,有三种形状可以选择
矩形:MORPH_RECT; 交叉形:MORPH_CORSS; 椭圆形:MORPH_ELLIPSE; 第二个参数ksize:是内核的尺寸(n,n)
getStructuringElement函数会返回指定形状和尺寸的结构元素。
参考
其实这里进行了一个与运算
bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1
2.掩膜(mask)
2.1在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:
数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。