OpenCV 中的色彩追踪形态学处理是一种图像处理技术,它可以通过对图像进行形态学处理来实现对特定颜色的追踪。在 OpenCV 中,可以使用 cv2.inRange() 函数来实现色彩追踪,使用形态学处理函数来对图像进行处理。
使用 cv2.inRange() 函数的基本语法如下:
mask = cv2.inRange(image, lower, upper)
其中,image 是输入图像,lower 和 upper 是颜色的下限和上限。
以下是两个示例说明:
示例一:使用色彩追踪形态学处理追踪红色物体
要使用色彩追踪形态学处理追踪红色物体,可以使用以下代码:
import cv2
import numpy as np
# 读取视频
cap = cv2.VideoCapture(0)
while True:
# 读取帧
ret, frame = cap.read()
# 转换颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 定义红色范围
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170, 50, 50])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
# 合并掩码
mask = mask1 + mask2
# 形态学处理
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 查找轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 500:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示图像
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
# 按下 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
这将打开摄像头并追踪红色物体。最终结果将在窗口中。
示例二:使用色彩追踪形态学处理进行手写数字识别
要使用色彩追踪形态学处理进行手写数字识别,可以使用以下代码:
import cv2
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
# 加载手写数字数据集
digits = load_digits()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=0)
# 训练神经网络模型
clf = MLPClassifier(hidden_layer_sizes=(100,), max_iter=500, alpha=1e-4, solver='sgd', verbose=10, tol=1e-4, random_state=1, learning_rate_init=.1)
clf.fit(X_train, y_train)
# 读取视频
cap = cv2.VideoCapture(0)
while True:
# 读取帧
ret, frame = cap.read()
# 转换颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 定义蓝色范围
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 形态学处理
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 查找轮廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 预测数字
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
digit = mask[y:y+h, x:x+w]
digit = cv2.resize(digit, (8, 8))
digit = digit.reshape(1, -1)
digit = digit / 16.0
pred = clf.predict(digit)
cv2.putText(frame, str(int(pred[0])), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 显示图像
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
# 按下 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
这将打开摄像头并使用色彩追踪形态学处理进行手写数字识别。最终结果将在窗口中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Opencv 色彩追踪 形态学处理 - Python技术站