# opencv 颜色识别
# 输出图片信息
- 高、宽和通道数目 (size)
- 像素数据 (shape)
- 每个通道的位数 (dtype)
import cv2 as cv | |
import numpy as np | |
def get_image_info(image): | |
print(type(image)) | |
print(image.size) | |
print(image.shape) | |
print(image.dtype) | |
img = cv.imread("/home/wlp/1.jfif") | |
cv.namedWindow("Image") | |
cv.imshow("Image", img) | |
get_image_info(img) | |
cv.waitKey(0) | |
cv.destroyAllWindows() |
# hsv
即色相、饱和度、明度(英语:Hue, Saturation, Value)
- 色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
- 饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取 0-100% 的数值。
- 明度(V),亮度(L),取 0-100%。

# 使用的到的相关工具
cv2.createTrackbar(str1,str2,num1,num2,func):创建滑动条 str1:滑动条名称、str2:滑动条窗口名称、num1,num2:滑动条下阈值、func:滑动滑动条时调用的函数cv2.getTrackbarPos(str1,str2):获取滑动条数值 str1:滑动条名称、str2:滑动条窗口名称cv2.inRange(imgHSV, Lower, Upper):保留 imgHSV 列表中在 lower 和 upper 之间的值,并置为 255,其余数置零img_mask =cv2.bitwise_and(img,img,mask=mask):数值相与,在 img(原图像上加掩膜),赋值给 img_maskall_img_mask = np.vstack([white_array, img,img_mask]):将 size 相同,颜色通道数相同的图像拼接起来cv2.putText(all_img_mask, str(white_mask)[0:6], (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2):在图像上写字import numpy as np
import cv2def val(x):
global Lower, Upper # 全局变量
# 获取滑动条的数值l_h = cv2.getTrackbarPos("LowH", "control") # 色相
h_h = cv2.getTrackbarPos("highH", "control")
l_s = cv2.getTrackbarPos("LowS", "control") # 饱和度
h_s = cv2.getTrackbarPos("highS", "control")
l_v = cv2.getTrackbarPos("LowV", "control") # 明度
h_v = cv2.getTrackbarPos("highV", "control")
Lower = np.array([l_h, l_s, l_v]) # 要识别颜色的下限,若没有这两行,图片为黑,无法改变颜色
Upper = np.array([h_h, h_s, h_v]) # 要识别的颜色的上限
def color_(img):
imgHSV = cv2.cvtColor(img , cv2.COLOR_BGR2HSV)
# 创建滑动条cv2.namedWindow("control")
cv2.resizeWindow("control",640,240)
cv2.createTrackbar("LowH", "control", 0, 179, val) # 调用 val 中相应部分,即 1_h
cv2.createTrackbar("highH", "control", 179, 179, val)
cv2.createTrackbar("LowS", "control", 0, 255, val)
cv2.createTrackbar("highS", "control", 255, 255, val)
cv2.createTrackbar("LowV", "control", 0, 255, val)
cv2.createTrackbar("highV", "control", 255, 255, val)
while (True):
mask = cv2.inRange(imgHSV, Lower, Upper)
# mask 是把 HSV 图片中在颜色范围内的区域变成白色,其他区域变成黑色white_mask = np.average(mask)
white_mask = white_mask / 255 * 100
# white_mask 是该色域在区域中的占比值img_mask = cv2.bitwise_and(img,img,mask=mask)
# img_mask 获得原图中的指定颜色图像all_img_mask = np.vstack([white_array, img, img_mask])
# all_img_mask 将所有的图像拼接起来cv2.putText(all_img_mask, str(white_mask)[0:6], (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
cv2.imshow("test", all_img_mask)
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
breakif __name__ == '__main__':
Lower = np.array([0, 0, 0]) # 要识别颜色的下限
Upper = np.array([179, 255, 255]) # 要识别的颜色的上限
white_array = np.zeros((50,200,3),np.uint8)
white_array.fill(255)
path = "/home/wlp/1.jpg"
img = cv2.imread(path)
img = cv2.resize(img,(200,200))
color_(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
![wode]()
# ivcam 实现连接手机摄像头
下载地址 [wode](iVCam - 手机用作电脑摄像头 - E2ESOFT)
只有 window 版本,无法在 linux 下实现
- 数据线连接
- WiFi 连接,电脑需连接手机热点才可以
linux 下使用 ip 摄像头实现 (python)(手机热点)(无法打开,失败)
手机下载 “ip 摄像头”
进入应用,开启服务器
linux 下使用 pycharm 写入代码
'''Opencv-python读取IP摄像头视频流/USB摄像头
'''
import cv2# 创建一个窗口 名字叫做 Windowcv2.namedWindow('Window', flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO | cv2.WINDOW_GUI_EXPANDED)
'''#打开USB摄像头
cap = cv2.VideoCapture(0)
'''
# 摄像头的 IP 地址,http:// 用户名:密码 @IP 地址:端口 /# ip_camera_url = 'rtsp://admin:admin@10.106.137.190:8554/live'ip_camera_url = "http://10.26.121.160:8080/"
# 创建一个 VideoCapturecap = cv2.VideoCapture(ip_camera_url)
print('IP摄像头是否开启: {}'.format(cap.isOpened()))
# 显示缓存数print(cap.get(cv2.CAP_PROP_BUFFERSIZE))
# 设置缓存区的大小cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
# 调节摄像头分辨率cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 设置 FPSprint('setfps', cap.set(cv2.CAP_PROP_FPS, 25))
print(cap.get(cv2.CAP_PROP_FPS))
while (True):
# 逐帧捕获ret, frame = cap.read() # 第一个参数返回一个布尔值(True/False),代表有没有读取到图片;第二个参数表示截取到一帧的图片
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Window', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break# 当一切结束后,释放 VideoCapture 对象cap.release()
cv2.destroyAllWindows()
# 识别物体并处理
import cv2 | |
import numpy as np | |
#读取图片 | |
def ReadImg(): | |
img = cv2.imread("/home/wlp/photo/idt.png") | |
cv2.imshow('src',img) | |
return img | |
#高斯滤波 | |
def GausBlur(src): | |
dst = cv2.GaussianBlur(src,(5,5),1.5) | |
cv2.imshow('GausBlur',dst) | |
return dst | |
#灰度处理 | |
def Gray_img(src): | |
gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) | |
cv2.imshow('gray',gray) | |
return gray | |
#二值化 | |
def threshold_img(src): | |
ret, binary = cv2.threshold(src,0,255,cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE) | |
print("threshold value %s"%ret) | |
cv2.imshow('threshold',binary) | |
return binary | |
#开运算操作 | |
def open_mor(src): | |
kernel = np.ones((5,5),np.uint8) | |
opening = cv2.morphologyEx(src,cv2.MORPH_OPEN,kernel, iterations=3) #iterations 进行 3 次操作 | |
cv2.imshow('open',opening) | |
return opening | |
#轮廓拟合 | |
'''def draw_shape(open_img,gray_img): | |
im2, contours, hierarchy = cv2.findContours(open_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) | |
cnt = contours[0] #得到第一个的轮廓 | |
rect = cv2.minAreaRect(cnt) | |
box = cv2.boxPoints(rect) | |
box = np.int0(box) | |
cv2.drawContours(src,[box],0,(0,0,255),3) #画矩形框 | |
#图像轮廓及中心点坐标 | |
M = cv2.moments(cnt)# 计算第一条轮廓的各阶矩,字典形式 | |
center_x = int(M['m10']/M['m00']) | |
center_y = int(M['m01']/M['m00']) | |
print('center_x:',center_x) | |
print('center_y:',center_y) | |
cv2.circle(src,(center_x,center_y),7,128,-1)#绘制中心点 | |
str1 = '(' + str(center_x)+ ',' +str(center_y) +')' #把坐标转化为字符串 | |
cv2.putText(src,str1,(center_x-50,center_y+40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)#绘制坐标点位 | |
cv2.imshow('show',src) | |
''' | |
src = ReadImg() | |
gaus_img = GausBlur(src) | |
gray_img = Gray_img(gaus_img) | |
thres_img = threshold_img(gray_img) | |
# open_img = open_mor(thres_img) | |
draw_shape(open_img,src) | |
cv2.waitKey(0) |
