OpenCV 抓取特定颜色
这篇教学会介绍使用 OpenCV 的 inrange() 方法,指定一个色彩范围,抓取图像中符合色彩范围内的颜色,透过这个方式,就可以筛选出图像中的特定颜色对象。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
inrange() 抓取特定范围颜色
使用 OpenCV 的 inrange() 方法,可以指定一个色彩的最低数值与最高数值 ( 使用 NumPy 数组 ),抓取符合这个色彩范围内的所有像素成为新图像 ( 范围外的像素都会被过滤掉 ),使用方法如下:
cv2.inRange(img, lowerb, upperb)
# img 來源影像
# 色彩範圍最低數值
# 色彩範圍最高數值
举例来说,如果要截取摄影机画面中的红色瓶盖,可以先观察并记录瓶盖的红色区间 ( 透过其他绘图软件 ),区间约略在红色 252 左右,绿色 70~80 之间,蓝色 55~70 之间。
下方的例子,将色彩选取的范围加大,搭配图像遮罩,就能将截取出红色的瓶盖的部分。
参考:图像遮罩
import cv2
import numpy as np
lower = np.array([30,40,200]) # 轉換成 NumPy 陣列,範圍稍微變小 ( 55->30, 70->40, 252->200 )
upper = np.array([90,100,255]) # 轉換成 NumPy 陣列,範圍稍微加大 ( 70->90, 80->100, 252->255 )
img = cv2.imread('oxxo.jpg')
mask = cv2.inRange(img, lower, upper) # 使用 inRange
output = cv2.bitwise_and(img, img, mask = mask ) # 套用影像遮罩
cv2.imwrite('output.jpg', output)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
即时抓取影片的特定颜色
延伸“读取并播放影片”文章的范例,就能即时独立出摄影机影片中的瓶盖。
import cv2
import numpy as np
lower = np.array([30,40,200]) # 轉換成 NumPy 陣列,範圍稍微變小 ( 55->30, 70->40, 252->200 )
upper = np.array([90,100,255]) # 轉換成 NumPy 陣列,範圍稍微加大 ( 70->90, 80->100, 252->255 )
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
mask = cv2.inRange(frame, lower, upper) # 使用 inRange
output = cv2.bitwise_and(frame, frame, mask = mask ) # 套用影像遮罩
cv2.imshow('oxxostudio', output)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注