cv2颜色空间(2)——交互式的颜色检测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_39611196/article/details/84939317

本文主要实现通过cv2只能够的鼠标事件实现图片中的颜色检测。

下面是示例代码:

import cv2
import glob
import numpy as np

# 鼠标回调函数
def showPixelValue(event, x, y, flags, param):
    global img, combinedResult, placeholder
    
    if event == cv2.EVENT_MOUSEMOVE:
        # 获取鼠标所在(x,y)位置的像素值
        bgr = img[y, x]
        
        # 将BGR线束转换为其他颜色格式
        ycb = cv2.cvtColor(np.uint8([[bgr]]), cv2.COLOR_BGR2YCrCb)[0][0]
        lab = cv2.cvtColor(np.uint8([[bgr]]), cv2.COLOR_BGR2Lab)[0][0]
        hsv = cv2.cvtColor(np.uint8([[bgr]]), cv2.COLOR_BGR2HSV)[0][0]
        
        # 创建一个空占位符以显示值
        placeholder = np.zeros((img.shape[0], 400, 3),dtype=np.uint8)
        
        # 使用颜色空间的值填充占位符
        cv2.putText(placeholder, "BGR {}".format(bgr), (20, 70), cv2.FONT_HERSHEY_COMPLEX, .9, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(placeholder, "HSV {}".format(hsv), (20, 140), cv2.FONT_HERSHEY_COMPLEX, .9, (255,255,255), 1, cv2.LINE_AA)
        cv2.putText(placeholder, "YCrCb {}".format(ycb), (20, 210), cv2.FONT_HERSHEY_COMPLEX, .9, (255,255,255), 1, cv2.LINE_AA)
        cv2.putText(placeholder, "LAB {}".format(lab), (20, 280), cv2.FONT_HERSHEY_COMPLEX, .9, (255,255,255), 1, cv2.LINE_AA)
        
        # 将两个结果组合在一个图像中并排显示
        combinedResult = np.hstack([img,placeholder])
        
        cv2.imshow('PRESS P for Previous, N for Next Image',combinedResult)

# 导入图片并绑定鼠标回调函数
global img
files = glob.glob('images/rub*.jpg')
files.sort()

img = cv2.imread(files[0])
img = cv2.resize(img, (400, 400))
cv2.imshow("PRESS P for Previous, N for Next Image", img)

# 创建一个空窗口
cv2.namedWindow('PRESS P for Previous, N for Next Image')

# 设置鼠标回调函数
cv2.setMouseCallback('PRESS P for Previous, N for Next Image', showPixelValue)
i = 0
while(1):
    k = cv2.waitKey(1) & 0xFF
    # 在文件夹下检查下一张图片
    if k == ord('n'):
        i += 1
        img = cv2.imread(files[i%len(files)])
        img = cv2.resize(img,(400,400))
        cv2.imshow('PRESS P for Previous, N for Next Image',img)
 
    # 在文件夹下检查前一张图片
    elif k == ord('p'):
        i -= 1
        img = cv2.imread(files[i%len(files)])
        img = cv2.resize(img,(400,400))
        cv2.imshow('PRESS P for Previous, N for Next Image',img)

    elif k == 27:
        cv2.destroyAllWindows()
        break

结果示例:

未放置鼠标之前:

放置鼠标之后:

猜你喜欢

转载自blog.csdn.net/github_39611196/article/details/84939317