目标:将红色的部分滤出,转化为绿色
下面是代码+ 效果 + 解释
import cv2
import numpy as np
def dectfun(frame):
# Convert the frame to HSV color space
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Define the range for red color in HSV
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])
# Create a mask for red color
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 + mask2
# Create an output image to show the detected red regions in green
result = frame.copy()
result[mask > 0] = [0, 255, 0] # Change red regions to green
return result
def main():
# Open the webcam
cap = cv2.VideoCapture(1)
while True:
# Read a frame
ret, frame = cap.read()
if not ret:
break
# Detect red regions and highlight them
result = dectfun(frame)
# Display the result
cv2.imshow("Frame", result)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Release the webcam and close all windows
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
转HSV: 关于颜色总是要转HSV的
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
掩膜
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])
# Create a mask for red color
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 + mask2
在这段代码中,mask 是一个数组。具体来说,它是一个二值图像(即一个包含0和255的数组),表示在HSV颜色空间中红色区域的掩膜。 在掩膜区域内的是我们的目标lower_red1, upper_red1
标注是255 其余是0
再标注
# Create an output image to show the detected red regions in green
result = frame.copy()
result[mask > 0] = [0, 255, 0] # Change red regions to green
return result
result = frame.copy()
在Python中,变量通常是引用类型,如果你在函数中直接修改传入的数组或对象,它们的值会永久改变。result[mask > 0] = [0, 255, 0]
这是个巧妙的句子,当mask的对应位置上的值大于零。 然后把result 对应位置上的像素改成绿色