import numpy as np import cv2 # 要识别的颜色范围(红、绿、蓝) color_range = [ ((0, 100, 100), (10, 255, 255), "red"), ((36, 100, 100), (86, 255, 255), "green"), ((100, 100, 100), (130, 255, 255), "blue"), ((20, 100, 100), (30, 255, 255), "yellow") ] cap = cv2.VideoCapture(0) while True: # 获取每一帧图像 ret, frame = cap.read() # 将每一帧图像转换为 HSV 空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 分别提取每种颜色的物体 for (lower, upper, color) in color_range: mask = cv2.inRange(hsv, lower, upper) # 对每种颜色的物体进行轮廓检测 contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: # 给每个物体标注一个矩形框 x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(frame, color, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 在图像上显示 cv2.imshow("frame", fra
时间: 2023-06-18 14:02:45 浏览: 46
me) # 按下 q 键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头资源和关闭所有窗口 cap.release() cv2.destroyAllWindows()
这是一个使用OpenCV实现颜色识别的程序。程序利用摄像头实时获取图像,然后将图像转换到HSV空间,通过设定的颜色范围提取出图像中对应的物体,并进行轮廓检测和矩形框标记。程序支持对红、绿、蓝、黄四种颜色的物体进行识别。
相关问题
import cv2 import numpy as np # 读取相机拍摄的图像 image = cv2.imread('3.jpg') # 将图像转换为HSV颜色空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义红色瓶盖的HSV颜色范围 lower_red = np.array([0, 50, 50]) upper_red = np.array([10, 255, 255]) # 根据颜色范围提取红色瓶盖的区域 mask = cv2.inRange(hsv, lower_red, upper_red)完善上述代码,显示结果
import cv2
import numpy as np
# 读取相机拍摄的图像
image = cv2.imread('3.jpg')
# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义红色瓶盖的HSV颜色范围
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
# 根据颜色范围提取红色瓶盖的区域
mask = cv2.inRange(hsv, lower_red, upper_red)
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2 import numpy as np import torch import torch.nn.functional as F from skimage.segmentation import slic import matplotlib.pyplot as plt from skimage.segmentation import mark_boundaries from skimage import img_as_float # 定义超像素数量 num_segments = 100 # 加载图像 A 和 B img_a = cv2.imread('img_a.jpg') img_b = cv2.imread('img_b.jpg') # 对图像 A 进行超像素分割,并获取每个超像素块的像素范围 segments_a = slic(img_as_float(img_a), n_segments=num_segments, sigma=5) pixel_ranges = [] for i in range(num_segments): mask = (segments_a == i) indices = np.where(mask)[1] pixel_range = (np.min(indices), np.max(indices)) pixel_ranges.append(pixel_range) # 将像素范围应用到图像 B 上实现超像素分割 segments_b = np.zeros_like(segments_a) for i in range(num_segments): pixel_range = pixel_ranges[i] segment_b = img_b[:, pixel_range[0]:pixel_range[1], :] segment_b = torch.from_numpy(segment_b.transpose(2, 0, 1)).unsqueeze(0).float() segment_b = F.interpolate(segment_b, size=(img_b.shape[0], pixel_range[1] - pixel_range[0]), mode='bilinear', align_corners=True) segment_b = segment_b.squeeze(0).numpy().transpose(1, 2, 0).astype(np.uint8) gray = cv2.cvtColor(segment_b, cv2.COLOR_BGR2GRAY) _, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY) segments_b[np.where(mask)] = i # 可视化超像素分割结果 fig = plt.figure('Superpixels') ax = fig.add_subplot(1, 2, 1) ax.imshow(mark_boundaries(img_as_float(cv2.cvtColor(img_a, cv2.COLOR_BGR2RGB)), segments_a)) ax = fig.add_subplot(1, 2, 2) ax.imshow(mark_boundaries(img_as_float(cv2.cvtColor(img_b, cv2.COLOR_BGR2RGB)), segments_b)) plt.axis("off") plt.show(),上述代码中segments_a = slic(img_as_float(img_a), n_segments=num_segments, sigma=5)出现错误:ValueError: Cannot convert from object to float64.
这个错误的原因可能是因为 `img_a` 的类型不是浮点类型,需要将其转换为浮点类型后再进行超像素分割。可以使用 `img_as_float` 函数将其转换为浮点类型,代码如下:
```
import cv2
import numpy as np
import torch
import torch.nn.functional as F
from skimage.segmentation import slic
import matplotlib.pyplot as plt
from skimage.segmentation import mark_boundaries
from skimage import img_as_float
# 定义超像素数量
num_segments = 100
# 加载图像 A 和 B
img_a = cv2.imread('img_a.jpg')
img_b = cv2.imread('img_b.jpg')
# 将图像 A 转换为浮点类型
img_a = img_as_float(img_a)
# 对图像 A 进行超像素分割,并获取每个超像素块的像素范围
segments_a = slic(img_a, n_segments=num_segments, sigma=5)
pixel_ranges = []
for i in range(num_segments):
mask = (segments_a == i)
indices = np.where(mask)[1]
pixel_range = (np.min(indices), np.max(indices))
pixel_ranges.append(pixel_range)
# 将像素范围应用到图像 B 上实现超像素分割
segments_b = np.zeros_like(segments_a)
for i in range(num_segments):
pixel_range = pixel_ranges[i]
segment_b = img_b[:, pixel_range[0]:pixel_range[1], :]
segment_b = torch.from_numpy(segment_b.transpose(2, 0, 1)).unsqueeze(0).float()
segment_b = F.interpolate(segment_b, size=(img_b.shape[0], pixel_range[1] - pixel_range[0]), mode='bilinear', align_corners=True)
segment_b = segment_b.squeeze(0).numpy().transpose(1, 2, 0).astype(np.uint8)
gray = cv2.cvtColor(segment_b, cv2.COLOR_BGR2GRAY)
_, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)
segments_b[np.where(mask)] = i
# 可视化超像素分割结果
fig = plt.figure('Superpixels')
ax = fig.add_subplot(1, 2, 1)
ax.imshow(mark_boundaries(img_as_float(cv2.cvtColor(img_a, cv2.COLOR_BGR2RGB)), segments_a))
ax = fig.add_subplot(1, 2, 2)
ax.imshow(mark_boundaries(img_as_float(cv2.cvtColor(img_b, cv2.COLOR_BGR2RGB)), segments_b))
plt.axis("off")
plt.show()
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)