【问题标题】:Take a picture based on the scale of detection- Python + OpenCV根据检测规模拍照- Python + OpenCV
【发布时间】:2016-04-12 13:04:19
【问题描述】:

下面是我通过网络摄像头检测人脸的代码。

import numpy as np
import cv2

face_cascade =     cv2.CascadeClassifier('C:\OpenCV2.0\data\haarcascades\haarcascade_frontalface_default.xml')


img = cv2.VideoCapture(0)

while(1):
    _,f=img.read()
    gray = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
         detect_frame = cv2.rectangle(f,(x,y),(x+w,y+h),(255,0,0),2)


    cv2.imshow('img',f)

if cv2.waitKey(25) == 27:
    break



cv2.destroyAllWindows()
img.release()

通过这段代码,我想在它实现换帧比例或人在移动时拍照。拍照后,它会将图片保存在一个文件中,然后继续它的工作。

你们能帮我解决这个案子吗?非常感谢您的热情。

【问题讨论】:

    标签: python opencv detect


    【解决方案1】:

    这是我写的代码,它的作用是首先找到我们通过人脸检测得到的矩形的中心。然后在一定的时间间隔(如2s)后比较中心坐标的值,如果像素的值变化超过某个阈值,则表明检测到运动。代码运行良好。为了提高准确性,您可以在条件中添加更多点,其值的变化将指示移动。

    import numpy as np
    import cv2
    
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    
    cap = cv2.VideoCapture(0)
    i=1000
    c=10 
    
    while 1:
        _, img = cap.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
        #we will increment the value of i after every loop so that we could check value of coordinate after a certain time
        i=i+1
    
        for (x,y,w,h) in faces:
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,150,10),2)
            roi_gray = gray[y:y+h, x:x+w]
            roi_color = img[y:y+h, x:x+w]
    
            #finding the center of the rectangle(around face)
            a=y+h/2
            b=x+w/2
    
            d = x + w / 2
            if i % 5 == 0:
                print (abs(a - c))
                if (abs(a-c))>9:            #change this value to calibrate
                    print("Movement Detected")
                c = y + h / 2
    
        cv2.imshow('img',img)
        k = cv2.waitKey(30) & 0xff
    
        if k == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    我们需要在某个时间后更新值来比较我使用的值 if i%5==0 其中 i 在每次循环后递增

    【讨论】:

    • 首先,我要感谢您的回答和您的代码。一旦检测到移动,我将尝试开发拍摄图像。
    • 嘿替换 if (abs(a-c))>9: with if ((abs(a-c))+abs(b-d))>18: print("Movement Detected") c = y + h / 2 d = x + w / 2 (在检测到移动后声明 d 并将 d 初始化为我们初始化 c 时的某个值)这将有所不同,现在它检测到 x 和 y 的变化。如果您在执行代码时遇到任何问题,请告诉我
    • 您好,感谢您的回复。我已经尝试了您提供的代码并“开发”了一些值,以便变得更清晰和流畅。但是我遇到的问题是“它只检测到一旦“蓝框”(检测框)发生变化,这意味着当我尝试向右或向左移动时,它不会检测到导致框架在这些动作期间没有改变。但是,我想给你一个代码来检测运动(不是通过“FACE”检测运动)。如果你想参考或使用它:))
    猜你喜欢
    • 2016-07-26
    • 2016-01-18
    • 1970-01-01
    • 2020-09-14
    • 2015-02-10
    • 2014-03-29
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多