# 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)

  1. 色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
  2. 饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取 0-100% 的数值。
  3. 明度(V),亮度(L),取 0-100%。

wode

# 使用的到的相关工具

  1. cv2.createTrackbar(str1,str2,num1,num2,func) :创建滑动条 str1:滑动条名称、str2:滑动条窗口名称、num1,num2:滑动条下阈值、func:滑动滑动条时调用的函数

  2. cv2.getTrackbarPos(str1,str2) :获取滑动条数值 str1:滑动条名称、str2:滑动条窗口名称

  3. cv2.inRange(imgHSV, Lower, Upper) :保留 imgHSV 列表中在 lower 和 upper 之间的值,并置为 255,其余数置零

  4. img_mask =cv2.bitwise_and(img,img,mask=mask) :数值相与,在 img(原图像上加掩膜),赋值给 img_mask

  5. all_img_mask = np.vstack([white_array, img,img_mask]) :将 size 相同,颜色通道数相同的图像拼接起来

  6. 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 cv2
    def 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()
                break
    if __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)(手机热点)(无法打开,失败)

  1. 手机下载 “ip 摄像头”

  2. 进入应用,开启服务器

  3. linux 下使用 pycharm 写入代码

    '''
    Opencv-python读取IP摄像头视频流/USB摄像头
    '''
    import cv2
    # 创建一个窗口 名字叫做 Window
    cv2.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/"
    # 创建一个 VideoCapture
    cap = 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))
    # 设置 FPS
    print('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)
更新于 阅读次数