# coding=UTF-8
import cv2 as cv
import numpy as np
def extrace_color_demo():
capture = cv.VideoCapture(0) #获取电脑摄像头权限
while(True):
#ret是布尔值,如果读取帧是正确的则返回True
#frame是每一帧的图像,是个三维矩阵
ret,frame = capture.read()
if ret == False:
break
#BGR图像转换为hsv图像
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
#设定阈值,确定追踪的颜色为绿色
lower_hsv = np.array([35,43,46])
upper_hsv = np.array([77,255,255])
#根据阈值构建掩模,构建黑白图
mask = cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)
#对原图像和掩模进行按位与运算,即绿颜覆盖白色区域,黑色保留
res = cv.bitwise_and(frame, frame, mask=mask)
cv.imshow("video",frame)
cv.imshow("mask",mask)
cv.imshow("res",res)
c = cv.waitKey(40)
if c ==27:
break
extrace_color_demo()
cv.waitKey()
cv.destroyAllWindows()
效果如下(不是故意给老乡鸡打广告的,只是手边只有这个绿色的东西):
附上各种常用颜色的阈值表格:
如果不想追踪绿色,想要追踪其他颜色,比如说,想要追踪红色,只需要修改lower_hsv和upper_hsv的值就可以。
开头代码原封不动,只要对lower_hsv和upper_hsv做如下修改为:
lower_hsv = np.array([156,43,46])
upper_hsv = np.array([180,255,255])
再看效果:
拓展一下opencv中的图像逻辑运算。
# coding=UTF-8
import cv2 as cv
import numpy as np
m1 = cv.imread("D:/academic/picture/opencv_data/LinuxLogo.jpg")
m2 = cv.imread("D:/academic/picture/opencv_data/WindowsLogo.jpg")
#逻辑与
logic_and = cv.bitwise_and(m1,m2)
#逻辑或
logic_or = cv.bitwise_or(m1,m2)
#逻辑非
m1_logic_not = cv.bitwise_not(m1)
m2_logic_not = cv.bitwise_not(m2)
#逻辑异或
logic_xor = cv.bitwise_xor(m1,m2)
cv.imshow("LinuxLogo",m1)
cv.imshow("WindowsLogo",m2)
cv.imshow("logic_and",logic_and)
cv.imshow("logic_or",logic_or)
cv.imshow("logic_xor",logic_xor)
cv.imshow("m1_logic_not",m1_logic_not)
cv.imshow("m2_logic_not",m2_logic_not)
cv.waitKey()
cv.destroyAllWindows()
运行效果如下:
对每个像素点进行处理。
在这里,得提醒一下,处理像素点时,要把像素矩阵里的值写成二进制形式。。。
逻辑与:两个1为1,其余为0.因为黑色为[0,0,0],所以逻辑与运算之后的像素点,也是黑色。而其余的,由于白色全是255,写成二进制后是1111 1111,和彩色像素点逻辑与后,就是彩色像素点的样子。
逻辑或:有1为1,没1为0.
逻辑异或:不同为1,相同为0.
逻辑非:1为0,0为1.