鼠标点击来动态确定 HSV 范围

根据鼠标点击来动态确定 HSV 范围,可以先获取用户点击的像素值,然后使用这个值生成合适的 HSV 范围。这样,我们可以提取图像中的特定颜色(比如蓝色框)

代码步骤:

  • 获取鼠标点击的颜色值:用户点击图像后,从该点提取 HSV 值。

  • 定义 HSV 范围:以点击的 HSV 值为中心,设置一定的上下限范围。

  • 基于 HSV 范围提取颜色:使用提取的 HSV 范围进行颜色分割,并提取相应的框。

    复制代码
     import cv2
     import numpy as np
     
     # 全局变量
     hsv_clicked = None
     
     def mouse_callback(event, x, y, flags, param):
         global hsv_clicked
         if event == cv2.EVENT_LBUTTONDOWN:  # 当检测到左键点击时
             # 获取点击处的BGR像素值
             pixel = img[y, x]
             print(f"Clicked BGR value: {pixel}")
             
             # 将BGR值转换为HSV
             hsv_pixel = cv2.cvtColor(np.uint8([[pixel]]), cv2.COLOR_BGR2HSV)
             hsv_clicked = hsv_pixel[0][0]
             print(f"Clicked HSV value: {hsv_clicked}")
     
             # 重新处理图像
             process_image_with_hsv_range(hsv_clicked)
     
     def process_image_with_hsv_range(hsv_value):
         # 设定点击颜色的HSV范围 (可根据需要调整)
         lower_hsv = np.array([hsv_value[0] - 10, max(50, hsv_value[1] - 50), max(50, hsv_value[2] - 50)])
         upper_hsv = np.array([hsv_value[0] + 10, min(255, hsv_value[1] + 50), min(255, hsv_value[2] + 50)])
     
         print(f"Lower HSV: {lower_hsv}")
         print(f"Upper HSV: {upper_hsv}")
     
         # 将图像转换为HSV
         hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
         
         # 基于点击的HSV范围生成掩码
         mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
         
         # 使用掩码提取颜色
         result = cv2.bitwise_and(img, img, mask=mask)
     
         # 查找边缘
         gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
         edges = cv2.Canny(gray, 50, 150)
     
         # 查找轮廓
         contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
         
         # 绘制轮廓的矩形框
         for contour in contours:
             area = cv2.contourArea(contour)
             if area > 500:  # 过滤小的轮廓
                 x, y, w, h = cv2.boundingRect(contour)
                 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
         
         # 显示结果
         cv2.imshow("Processed Image", img)
     
     # 加载图像
     image_path = "/mnt/data/blue.png"
     img = cv2.imread(image_path)
     
     # 显示图像并设置鼠标回调函数
     cv2.imshow('Image', img)
     cv2.setMouseCallback('Image', mouse_callback)
     
     # 等待用户操作
     cv2.waitKey(0)
     cv2.destroyAllWindows()

代码说明:

  1. 鼠标点击获取颜色值:

当用户点击图像时,通过鼠标回调函数 mouse_callback() 获取点击位置的 BGR 值,然后将其转换为 HSV。

打印出的 BGR 和 HSV 值是用于调试的。

  1. 设定 HSV 范围:

使用点击的 HSV 值来生成上下限范围,稍微扩展一下上下限(+/- 10)来包含颜色的近似值。

上下限中的色相范围是 ±10,而饱和度和亮度可以根据情况调整。

  1. 图像处理:

通过 cv2.inRange() 函数使用生成的 HSV 范围来创建掩码,接着用掩码提取出该颜色的部分。

之后,通过 cv2.findContours() 查找轮廓,并在原图上绘制矩形框标出提取到的区域。

使用步骤:

  • 运行程序,图像窗口会弹出。
  • 在弹出的图像窗口中点击你希望提取的蓝色框的某一点。 程序将提取点击位置的 HSV 值,使用这个 HSV 值来提取图像中所有符合这个颜色范围的区域。 你可以根据需要调整 HSV 范围,以提取不同的颜色范围。
相关推荐
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章98-频域滤波
图像处理·人工智能·opencv·计算机视觉
落苜蓿蓝1 天前
多张覆盖视场的平面棋盘图片; 、对每张图片用 OpenCV 的 findChessboardCorners 检测内角点并用 corn ...
数码相机·opencv·平面
明如正午1 天前
【python】Python + OpenCV 实现视频关键帧提取与智能去重
python·opencv·音视频
azoo2 天前
SimpleBlobDetector的使用
opencv
映翰通网络2 天前
TI开发板上的边缘AI工具链:先认清OpenCV、GStreamer和TIDL
人工智能·嵌入式硬件·opencv·计算机视觉·ti
小保CPP2 天前
OpenCV C++形态学操作-腐蚀与膨胀
c++·人工智能·opencv·计算机视觉
m沐沐2 天前
【深度学习】模型部署全解析——从原理到Flask服务端实战
人工智能·后端·python·深度学习·opencv·flask
阿_旭3 天前
【分割实战】三种图像分割方法实战对比:Mask R-CNN + GrabCut + OpenCV【附源码】
opencv·图像分割
小保CPP3 天前
OpenCV C++车型识别1-图像预处理
c++·人工智能·opencv·计算机视觉
小保CPP3 天前
OpenCV C++车型识别2-形状匹配
c++·人工智能·opencv·计算机视觉