opencv--颜色识别

目录

一、主要函数介绍

 二、颜色识别

 三、其他相关函数介绍

1. cv2.resize

2. np.array(x,dtype)

         3. cv2.inRange()

4. cv2.imshow()

5.cv2. waitKey()

四、掩膜


一、主要函数介绍

通常,相机在RGB颜色模式下工作,但这种模式受到光线的影响较大,所以在opencv中,用HSV(色彩、饱和度、亮度)模型对颜色进行定义。

除此之外,opencv中有多种色彩空间,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab8种,使用中经常要遇到色彩空间的转化。

可以使用opencv中cv2.cvtColor()函数来改变图像的颜色空间,该函数形式为:

                                                cv2.cvtColor(frame,flag)

参数介绍:

@frame    为要进行处理的图片;

@flag       为要进行的色彩转换方式;

对于BGR<-->Gray的转换,我们用的flag就是cv2.COLOR_BGR2GRAY

对于BGR<-->HSV的转换,我们用的flag就是cv2.COLOR_BGR2HSV

 二、颜色识别

我们对于颜色的转换主要是通过BGR<-->HSV的形式,所以我们进行颜色识别之前,还是要首先获取RGB的数值,该数值可以用Inkscape工具进行抓取。 

Draw Freely | InkscapeInkscape is professional quality vector graphics software which runs on Linux, Mac OS X and Windows desktop computers.https://inkscape.org/Inkscape工具官网:Draw Freely | Inkscape

我们通过命令窗口,输入命令和BGR的值,就可以得到HSV的上下范围值。然后打开colorDetection.py文件,我们把得到的上下范围值数据更改一下,

lower_range = np.array([24, 100, 100], dtype=np.uint8)
upper_range = np.array([44, 255, 255], dtype=np.uint8)

 三、其他相关函数介绍

1. cv2.resize

img = cv2.resize(img, (0,0), fx=0.2, fy=0.2)

该函数是opencv库中的一个函数,主要起到对图片进行缩放的作用

参数介绍:

resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

  InputArray src :输入,原图像,即待改变大小的图像;

  OutputArray dst:输出,改变后的图像。这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;

  dsize:输出图像的大小,将原图片转化为宽和长分别为x,y的图片

  fx和fy是图像width方向和height方向的缩放比例。

  fx:width方向的缩放比例

  fy:height方向的缩放比例

  如果fx=0.2,fy=0.2,则将原图片的x轴缩小为原来的0.2倍,将y轴缩小为原来的0.2倍

  interpolation(插值):这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:

  INTER_NEAREST - 最邻近插值

  INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法

  INTER_CUBIC - 4x4像素邻域内的双立方插值

  INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

更详细的介绍可以看这篇博客:

cv2.resize()原理详解_AI bro的博客-CSDN博客_cv2.resize

2. np.array(x,dtype)

将x转化为一个类型为type的数组

3. cv2.inRange()

作用:通过设置阈值,去除背景部分

mask = cv2.inRange(hsv, lower_range, upper_range)

  第一个参数:hsv指的是原图

  第二个参数:lower_range,指的是图像中低于这个lower_range的值,图像值变为0

  第三个参数:upper_range指的是图像中高于这个upper_range的值,图像值变为0

  而在lower_range~upper_range之间的值变成255。

4. cv2.imshow()

作用:在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。

第一个参数是一个窗口名称(也就是我们对话框的名称),它是一个字符串类型。第二个参数是我们的图像。您可以创建任意数量的窗口,但必须使用不同的窗口名称。

cv2.imshow('mask',mask)
cv2.imshow('image', img)

5.cv2. waitKey()

功能是等待用户的按键响应(可以不断刷新图像),频率时间为delay,单位为ms 返回值为当前键盘按键值。如果用户没有按下键,则继续等待(循环)

常见:设置waitKey(0),则表示程序会无限制的等待用户的按键事件。

if cv2.waitKey(100)==27:

#特定的100ms print('wait 100 ms')

等待用户触发事件,等待时间为100ms,如果在这个时间段内,用户按下ESC(ASCII码为27),执行 if体如果没有按,if函数不做处理

waitKey()函数与imshow()函数之间的关系:

在使用中,imshow函数后面通常都会跟着waitKey 函数。waitKey控制着imshow的持续时间,当imshow之后不跟waitKey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitKey后,图像将会有一个显示的时间,而不会一闪而过。

更详细的介绍可以看这篇博客:

https://blog.csdn.net/chengfenglee/article/details/112251358

运行之后就可以得到图片掩膜处理之后的图像。也就是说我们要找的黄色已经被找到并且做了处理。

四、掩膜

掩膜主要用于:

①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。例如,我们要检测一幅图像中眼睛的位置,我们首先要在图像中找到脸,再在脸的区域中找到眼睛,而不是直接在一幅图像中搜索。

②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。

③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

④特殊形状图像的制作。

  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1. 从 4.5 版本开始,OpenCV将正式使用Apache 2 授权协议,对开发者更加友好,避免专利算法进入OpenCV带来的潜在纠纷。 2. 因为SIFT 专利到期,成为公有技术,代码被移到主库(其实 4.4 版本已经进了)。 3. OpenCV中的RANSAC 算法进行了改进,相信做过图像匹配的同学都不陌生。 4. 新增了实时单目标跟踪算法SiamRPN++。 5. 改进了数字识别和文本识别的例程: 6. 针对RISC-V指令集进行了优化。 7. 增加Julia语言OpenCV绑定,Julia是一门高性能编程语言,但其一直缺少计算机视觉库的支持,这无疑对Julia社区是个大好消息。 8. 增加对 Macbeth 图检测的支持,Macbeth 图是用于相机颜色校正的图像色块。(很明显这么基础的功能,应该早就支持) 9. RGBD 新增基于 TSDF volume 的 Hashtable ,以支持大范围环境的深度图的融合。 11. 增加了对OpenCL多上下文的支持。 12. DNN 模块改进了对一些层和激活函数的支持(ONNX: ReduceSum, Gather, 改进的Reshape等),后端支持 OpenVINO 到2021.1版,并修复和优化了对CUDA 的支持。 特别值得一提的是,由国内公司OpenAI Lab优化后的OpenCV DNN 在ARM上的表现喜人,在新引擎 Tengine lite 加持下,速度获得了较大幅度提升。 13. OpenCV中的图计算模块G-API,也进行了大量更新。 14. 另外FLANN模块也被改进,新增了机器人手眼校准函数等。 由以上内容可知,OpenCV 4.5 版本没有特别重大的更新,大多是在修补、完善、优化,因为 5.0版本快要到来,4.x 系列版本“基本”已经进入“稳”而不张的维护阶段。
以下是一个简单的颜色识别示例,使用OpenCV-Python库: ``` import cv2 import numpy as np # 定义颜色范围 lower_red = np.array([0, 50, 50]) upper_red = np.array([10, 255, 255]) lower_blue = np.array([110, 50, 50]) upper_blue = np.array([130, 255, 255]) lower_green = np.array([50, 50, 50]) upper_green = np.array([70, 255, 255]) # 读取图像并转换为HSV格式 img = cv2.imread('color_image.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 根据颜色范围创建掩膜 mask_red = cv2.inRange(hsv, lower_red, upper_red) mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) mask_green = cv2.inRange(hsv, lower_green, upper_green) # 对原始图像进行掩膜操作,提取出指定颜色的区域 res_red = cv2.bitwise_and(img, img, mask=mask_red) res_blue = cv2.bitwise_and(img, img, mask=mask_blue) res_green = cv2.bitwise_and(img, img, mask=mask_green) # 显示结果 cv2.imshow('Original Image', img) cv2.imshow('Red Region', res_red) cv2.imshow('Blue Region', res_blue) cv2.imshow('Green Region', res_green) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先定义了三个颜色的范围:红色、蓝色和绿色。然后,我们读取了一个图像,并将其转换为HSV格式。接下来,我们使用`cv2.inRange()`函数创建了三个掩膜,分别用于提取红色、蓝色和绿色区域的像素。最后,我们使用`cv2.bitwise_and()`函数将原始图像与掩膜进行操作,提取出指定颜色的区域,并将其显示出来。 请注意,这个例子只是一个基础示例,您可以根据需要修改颜色范围,并添加更多的颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值