Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测到特定颜色后停止网络摄像头_Python_Opencv_Colors_Webcam_Color Detection - Fatal编程技术网

Python 检测到特定颜色后停止网络摄像头

Python 检测到特定颜色后停止网络摄像头,python,opencv,colors,webcam,color-detection,Python,Opencv,Colors,Webcam,Color Detection,我已经写了一个代码,检测浅粉红色。现在我想添加一个代码,在检测到淡粉色后自动关闭网络摄像头。你能帮我做这个吗? 以下是编辑后的代码: import cv2 import numpy as np cap = cv2.VideoCapture(0) while(1): _, frame = cap.read() hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_pink = np.array([160,50,50])

我已经写了一个代码,检测浅粉红色。现在我想添加一个代码,在检测到淡粉色后自动关闭网络摄像头。你能帮我做这个吗? 以下是编辑后的代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):
    _, frame = cap.read()

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    lower_pink = np.array([160,50,50])
    upper_pink = np.array([180,255,255])

    mask = cv2.inRange(hsv, lower_pink, upper_pink)

    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(frame,frame, mask= mask)
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    break

if(cv2.countNonZero(mask) > 0):
    print("FOUND")
    raise SystemExit

cv2.destroyAllWindows()

带有无条件的
中断
(并且不可能
继续
)的循环没有意义,因为它在语义上没有循环

测试必须在循环中进行,因为您希望将其应用于每个捕获的图像,直到第一个图像中有足够的粉红色为止。然后,
中断
循环。不要在这里退出程序,因为这样循环后的清理代码就不再执行了。通过提升
SystemExit
退出有点奇怪,这就是
sys.exit()
函数的作用

import cv2
import numpy as np

def main():
    lower_pink = np.array([160, 50, 50])
    upper_pink = np.array([180, 255, 255])
    threshold = 100  # TODO Adapt to your needs.
    cap = cv2.VideoCapture(0)

    while True:
        _, frame = cap.read()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, lower_pink, upper_pink)
        masked = cv2.bitwise_and(frame, frame, mask=mask)
        cv2.imshow('frame', frame)
        cv2.imshow('mask', mask)
        cv2.imshow('masked', masked)
        # if cv2.countNonZero(mask) > threshold:
        #     print('FOUND')
        #     break
        print(cv2.countNonZero(mask))
        # 
        # Wait for escape key.
        # 
        if cv2.waitKey(500) == 27:
            break

    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

实际的阈值测试被注释掉,并通过打印掩码的像素计数来替换,这样您就可以确定哪个值适合您的需要。

带有无条件的
中断
(并且不可能
继续
)的循环没有意义,因为它在语义上没有循环

测试必须在循环中进行,因为您希望将其应用于每个捕获的图像,直到第一个图像中有足够的粉红色为止。然后,
中断
循环。不要在这里退出程序,因为这样循环后的清理代码就不再执行了。通过提升
SystemExit
退出有点奇怪,这就是
sys.exit()
函数的作用

import cv2
import numpy as np

def main():
    lower_pink = np.array([160, 50, 50])
    upper_pink = np.array([180, 255, 255])
    threshold = 100  # TODO Adapt to your needs.
    cap = cv2.VideoCapture(0)

    while True:
        _, frame = cap.read()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, lower_pink, upper_pink)
        masked = cv2.bitwise_and(frame, frame, mask=mask)
        cv2.imshow('frame', frame)
        cv2.imshow('mask', mask)
        cv2.imshow('masked', masked)
        # if cv2.countNonZero(mask) > threshold:
        #     print('FOUND')
        #     break
        print(cv2.countNonZero(mask))
        # 
        # Wait for escape key.
        # 
        if cv2.waitKey(500) == 27:
            break

    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

实际阈值测试将被注释掉,并通过打印遮罩的像素计数来替换,以便您可以确定哪个值适合您的需要。

当遮罩显示您已找到粉红色时,您可以退出测试(即遮罩中至少有一些像素不是零)。有点像
if(cv2.countNonZero(mask)>阈值):break
我对图像处理和所有这些都是新手。你能不能加上我应该写的阈值?因为当我把它设为零并运行代码时。窗口(hsv、mask、res)仅在毫秒内关闭。粉红色斑点的最小大小是多少?你应该确保不要因为一些嘈杂的粉红点而关门。您可以将其设置为10、20、50、100,然后查看哪种方式效果最好。更好的方法是获取遮罩中最大水滴的尺寸,并在足够大的情况下退出。这将对噪声点更加鲁棒。当你的遮罩显示你已经找到粉红色(即遮罩中至少有一些像素不是零)时,你可以退出。有点像
if(cv2.countNonZero(mask)>阈值):break
我对图像处理和所有这些都是新手。你能不能加上我应该写的阈值?因为当我把它设为零并运行代码时。窗口(hsv、mask、res)仅在毫秒内关闭。粉红色斑点的最小大小是多少?你应该确保不要因为一些嘈杂的粉红点而关门。您可以将其设置为10、20、50、100,然后查看哪种方式效果最好。更好的方法是获取遮罩中最大水滴的尺寸,并在足够大的情况下退出。这将是更强大的噪音点。嘿,谢谢你纠正我。我是初学者。代码确实工作得很好,但问题是它甚至没有显示掩码和结果窗口,我在几毫秒内就收到了find消息。我甚至尝试更改阈值,但结果相同。代码工作正常还是有问题?我已更改代码,以便您可以测试在不同情况下(对象、照明等)遮罩的像素数。嘿,谢谢您纠正我。我是初学者。代码确实工作得很好,但问题是它甚至没有显示掩码和结果窗口,我在几毫秒内就收到了find消息。我甚至尝试更改阈值,但结果相同。代码工作正常还是有问题?我更改了代码,以便您可以测试在不同情况下(对象、照明等)遮罩的像素数。