徐州 网站制作,网站平台定制开发,汕头站,怎样建设百度网站今日继续学习树莓派4B 4G#xff1a;#xff08;Raspberry Pi#xff0c;简称RPi或RasPi#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1#xff1a; 学了这些OpenCv的理论性知识#xff0c;不进行实践实在…今日继续学习树莓派4B 4GRaspberry Pi简称RPi或RasPi 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1 学了这些OpenCv的理论性知识不进行实践实在是太无聊了今天就尝试使用OpenCv已知颜色信息来识别一张图片的颜色 并输出掩膜图像坐标范围等。 目录 掩膜的基本知识: RGB颜色控件与HSV RGB颜色空间 HSV颜色空间 准备需要识别的图片: 编写RGB转BGR程序 测试转换程序: 编写颜色识别程序: 测试颜色识别程序: 更改掩膜颜色: 进一步获取掩膜的有用参数 1、计算掩膜覆盖的像素: 2、找到掩膜中物体的边界框Bounding Box 3、计算掩膜中物体的质心Centroid 4、计算掩膜中物体的面积 综合测试效果如下: 整体测试工程下载 网上查阅资料贴出: 掩膜的基本知识: 掩膜是由0和1组成的一个二进制图像。 当在某一功能中应用掩膜时1值区域被处理被屏蔽的0值区域不被包括在计算中。通过制定的数据值数据范围有限或无限值感兴趣区和注释文件来定义图像掩膜也可以应用上述选项的任意组合作为输入来建立掩膜。 以下定义为AI生成: **掩膜Mask**是一个二维数组或矩阵通常与图像具有相同的尺寸但数据类型通常是二值化的例如8位无符号整数其中0表示“无”或“透明”而非零值如255表示“有”或“不透明”。掩膜在图像处理中主要用于以下目的 区域选择你可以使用掩膜来选择图像中的特定区域进行进一步处理。例如你可能只对图像中的某个特定形状或区域感兴趣那么你可以创建一个只在该区域内部为1或255其他地方为0的掩膜然后将其与原始图像相乘从而只保留你感兴趣的区域。形态学操作在形态学图像处理中如腐蚀erosion和膨胀dilation掩膜被用作结构元素。这些结构元素定义了邻域的形状和大小用于确定像素的邻域如何影响该像素的最终值。融合和混合掩膜也可以用于将两个或多个图像融合在一起。例如你可以使用掩膜来定义如何将一个图像的内容叠加到另一个图像上只在掩膜为1的位置进行叠加。图像修复在图像修复或去噪中掩膜可以帮助确定哪些像素需要被修复或替换。 RGB颜色控件与HSV 在已知的图像中我们常用RGB的三元值大小来描述一个颜色但RGB不适用于环境变化的情况因此需要将RGB转换为HSV的描述形式 这里需要注意的是通过软件获取RGB数值后传给Opencv程序的顺序应该是BGR RGB颜色空间 RGB红、绿、蓝颜色控件是基于RGB颜色空间的。RGB颜色空间是工业界的一种颜色标准它使用三个颜色通道红色、绿色和蓝色来表示颜色。每个通道都有256个可能的值从0到255因此RGB颜色空间可以表示约16,777,216种不同的颜色即256^3。 特点 基础性RGB颜色空间是图像处理中最基本、最常用的颜色空间因为它与大多数显示设备和打印设备直接相关。面向硬件RGB颜色空间是面向硬件的因此它在计算机图形和图像处理中非常常见。受亮度影响RGB颜色空间的三个分量红、绿、蓝都与亮度密切相关。因此当亮度改变时三个分量都会相应地改变。均匀性较差RGB颜色空间是一种均匀性较差的颜色空间因为人眼对这三种颜色分量的敏感程度是不一样的。 HSV颜色空间 HSV色调、饱和度、明度颜色控件是基于HSV颜色空间的。HSV颜色空间比RGB更接近人们对彩色的感知经验它使用色调Hue、饱和度Saturation和明度Value三个参数来描述颜色。 特点 直观性HSV颜色空间非常直观地表达颜色的色调、鲜艳程度和明暗程度方便进行颜色的对比。稳定性HSV颜色空间在面对光照变化时比RGB更稳定能更好地反映颜色的本质。适合图像处理由于HSV颜色空间的直观性和稳定性它在图像处理中比RGB更受欢迎。例如在HSV颜色空间下更容易跟踪某种颜色的物体常用于分割指定颜色的物体。参数范围在HSV颜色空间中色调H的取值范围为0°到360°饱和度S和明度V的取值范围通常为0%到100%。 准备需要识别的图片: 这里我使用Photoshop随手画了个图片并使用取色器获取到了 其中蓝色区域RGB的数值 B: 255 G: 97 R: 34 # codingutf-8
import sys
import numpy as np
import cv2blue sys.argv[1]
green sys.argv[2]
red sys.argv[3] color np.uint8([[[blue, green, red]]])
hsv_color cv2.cvtColor(color, cv2.COLOR_BGR2HSV)hue hsv_color[0][0][0]print(Lower bound is :),
print([ str(hue-10) , 100, 100]\n)print(Upper bound is :),
print([ str(hue 10) , 255, 255])编写RGB转BGR程序 编写以下程序能辅助我们将已知颜色的BGR数值转换为HSV形式: # codingutf-8
import sys
import numpy as np
import cv2blue sys.argv[1]
green sys.argv[2]
red sys.argv[3] color np.uint8([[[blue, green, red]]])
hsv_color cv2.cvtColor(color, cv2.COLOR_BGR2HSV)hue hsv_color[0][0][0]print(Lower bound is :),
print([ str(hue-10) , 100, 100]\n)print(Upper bound is :),
print([ str(hue 10) , 255, 255])测试转换程序: 1、现将编写好的脚本传输给树莓派通过mobaxterm的SSH远程连接 2、在终端输入命令运行得到运算结果如下 编写颜色识别程序: 1、接下来编写颜色识别程序如下 注意: 如果你使用的图片需要检测的已知BGR与我不一致那你需要再回到上一步获取对应HSV值并在代码中将这俩行替换: # 这行指定了文件的编码格式为utf-8
# codingutf-8 import cv2
import numpy as np# 使用cv2.imread函数读取指定路径下的图片文件。第二个参数1表示读取彩色图像BGR格式
img cv2.imread(/home/pi/Pictures/Colour_test1.jpg, 1)# 使用cv2.resize函数调整图像大小。这里目标宽度和高度被设置为(0,0)表示将按照给定的缩放因子fx和fy来缩放图像。
# fx0.2和fy0.2表示图像在水平和垂直方向上都将缩小到原来的20%。
#img cv2.resize(img, (0,0), fx0.2, fy0.2)# 将图像从BGR色彩空间转换为HSV色彩空间。HSV色彩空间更适用于颜色范围检测因为它基于色调(H)、饱和度(S)和亮度(V)。
hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 定义一个NumPy数组表示HSV色彩空间中颜色的下界。这里的数值代表色调、饱和度和亮度的最小值。
lower_range np.array([101, 100, 100], dtypenp.uint8)
# 定义一个NumPy数组表示HSV色彩空间中颜色的上界。这里的数值代表色调、饱和度和亮度的最大值。
upper_range np.array([121, 255, 255], dtypenp.uint8)# 使用cv2.inRange函数根据指定的HSV颜色范围创建一个掩码图像。该掩码图像中属于指定颜色范围的像素值为255白色其他像素值为0黑色。
mask cv2.inRange(hsv, lower_range, upper_range)# 使用cv2.imshow函数显示掩码图像窗口标题为mask。
cv2.imshow(mask,mask)
# 使用cv2.imshow函数显示原始图像经过缩放和色彩空间转换后窗口标题为image。
cv2.imshow(image, img)while(1):
#等待用户按键按下‘q’就释放资源退出程序keycv2.waitKey(1)if key0XFFord(q):breakcv2.destroyAllWindows() 2、将图片SSH传输给树莓派: 注意: 图片位置需要与程序对应这个请自行检查 测试颜色识别程序: 发现能够将识别到的颜色掩膜输出: 更改掩膜颜色: 我们可以在之前程序基础上对掩膜的颜色进行更改: 只需添加一句 然后就改变掩膜的颜色为灰色了: 进一步获取掩膜的有用参数
1、计算掩膜覆盖的像素: 需要注意的是这里的mask的值需要根据你的具体设置进行更改: num_pixels np.sum(mask 255) # 或者 np.count_nonzero(mask) print(fNumber of pixels in the mask: {num_pixels}) 2、找到掩膜中物体的边界框Bounding Box 通过寻找掩膜中所有非零像素的边界您可以得到这些像素在图像中的位置。 # 使用OpenCV的findContours函数找到轮廓
contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 假设我们只关心最大的轮廓即最大的物体
if contours: c max(contours, keycv2.contourArea) x, y, w, h cv2.boundingRect(c) print(fBounding box of the object: ({x}, {y}), ({w}, {h})) 3、计算掩膜中物体的质心Centroid 质心是物体所有像素的加权平均位置。 M cv2.moments(contours[0]) if contours else None
if M ! None: cX int(M[m10] / M[m00]) cY int(M[m01] / M[m00]) print(fCentroid of the object: ({cX}, {cY})) 4、计算掩膜中物体的面积 这可以通过计算掩膜中非零像素的数量来实现。 area cv2.contourArea(contours[0]) if contours else 0
print(fArea of the object: {area}) 综合测试效果如下: 整体测试工程下载 https://download.csdn.net/download/qq_64257614/89426048 网上查阅资料贴出: [树莓派基础]7.树莓派OpenCV颜色识别案例讲解_哔哩哔哩_bilibili opencv(12): 掩膜Mask_opencv mask-CSDN博客