获取图片指定坐标点的hsv和指定颜色的部分

  • Post author:
  • Post category:其他




基于OpenCV的hsv获取

首先,需要在PyCharm中配置环境

opencv-python版本4.4.0, Python版本: 3.9

。配置完成后,直接上代码:

import cv2
import numpy as np
# 定义鼠标交互函数
def mouseColor(event, x, y, flags, param):
    # CV_EVENT_LBUTTONDOWN    =1,   //按下左键
    if event == cv2.EVENT_LBUTTONDOWN:
        print('HSV:', hsv[y, x])  #输出图像坐标(x,y)处的HSV的值
if __name__ == "__main__":
    img = cv2.imread('C:/Users/wenhaofu/Desktop/picture/on.png')  #读进来是BGR格式
    # C:/Users/wenhaofu/Desktop/picture/blue.png
    # C:/Users/wenhaofu/Desktop/picture/on.png
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  #变成HSV格式
    cv2.namedWindow("Color Picker")
    '''
    winname:窗口的名字
    onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 
    这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
    userdate:传给回调函数的参数 
    '''
    cv2.setMouseCallback("Color Picker", mouseColor) #鼠标相应回调函数
    cv2.imshow("Color Picker", img)

    
    low_hsv = np.array([100, 43, 46])
    high_hsv = np.array([124, 255, 255])
    mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
    cv2.imshow("test", mask)

if cv2.waitKey(0):
    cv2.destroyAllWindows()


在图片上点击鼠标左键,即可获得该位置的hsv。将蓝色部分变为白色(视觉上的)。

Api



调用函数

 void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
    winname:窗口的名字
    onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
    userdate:传给回调函数的参数 

接下来介绍on_Mouse函数:

void on_Mouse(int event, int x, int y, int flags, void* param);
event是 CV_EVENT_*变量之一
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系) 
flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。

这里是全部事件:

enum
{
    CV_EVENT_MOUSEMOVE      =0,   //鼠标移动
    CV_EVENT_LBUTTONDOWN    =1,   //按下左键
    CV_EVENT_RBUTTONDOWN    =2,   //按下右键
    CV_EVENT_MBUTTONDOWN    =3,   //按下中键
    CV_EVENT_LBUTTONUP      =4,   //放开左键
    CV_EVENT_RBUTTONUP      =5,   //放开右键
    CV_EVENT_MBUTTONUP      =6,   //放开中键
    CV_EVENT_LBUTTONDBLCLK  =7,   //左键双击
    CV_EVENT_RBUTTONDBLCLK  =8,   //右键双击
    CV_EVENT_MBUTTONDBLCLK  =9,   //中键双击
    CV_EVENT_MOUSEWHEEL     =10,  //滚轮滚动
    CV_EVENT_MOUSEHWHEEL    =11   //横向滚轮滚动(还好我鼠标是G502可以这么干)
};

enum
{
    CV_EVENT_FLAG_LBUTTON   =1,   //左键拖拽
    CV_EVENT_FLAG_RBUTTON   =2,   //右键拖拽
    CV_EVENT_FLAG_MBUTTON   =4,   //中键拖拽
    CV_EVENT_FLAG_CTRLKEY   =8,   //按住CTRL拖拽
    CV_EVENT_FLAG_SHIFTKEY  =16,  //按住Shift拖拽
    CV_EVENT_FLAG_ALTKEY    =32   //按住ALT拖拽
};



hsv范围

注意到这里红色的hmin和hmax有两个值,但是我这里使用156和180时,并没有得到想要的结果。

结果如下图,可以发现正确识别了图中的红色部分。

hsv



版权声明:本文为FuWen_Hao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。