最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用 Python 和 OpenCV 實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖功能

 更新時(shí)間:2024年11月13日 10:46:53   作者:燕鵬01  
在現(xiàn)代應(yīng)用中,人臉檢測(cè)是一項(xiàng)非常重要的技術(shù),廣泛應(yīng)用于安全監(jiān)控、身份驗(yàn)證等領(lǐng)域,本文詳細(xì)介紹了如何使用 Python 和 OpenCV 庫(kù)實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖,并通過(guò)具體的代碼示例展示了整個(gè)過(guò)程,感興趣的朋友一起看看吧

概述

在現(xiàn)代應(yīng)用中,人臉檢測(cè)是一項(xiàng)非常重要的技術(shù),廣泛應(yīng)用于安全監(jiān)控、身份驗(yàn)證等領(lǐng)域。本文將詳細(xì)介紹如何使用 Python 和 OpenCV 庫(kù)實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖,并通過(guò)具體的代碼示例來(lái)展示整個(gè)過(guò)程。

環(huán)境準(zhǔn)備

在開(kāi)始編寫代碼之前,確保已經(jīng)安裝了 OpenCV 庫(kù)??梢允褂靡韵旅畎惭b:

pip install opencv-python

代碼詳解

# -*- coding: utf-8 -*-
# import 進(jìn)openCV的庫(kù)
import cv2
import os
import time
# 調(diào)用攝像頭檢測(cè)人臉并截圖
def camera(window_name, path_name):
    # Linux 不顯示圖形界面
    cv2.namedWindow(window_name)
    # 視頻來(lái)源,來(lái)自USB攝像頭
    cap = cv2.VideoCapture(0)
    # 告訴OpenCV使用人臉識(shí)別分類器
    classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")
    # 識(shí)別出人臉后要畫的邊框的顏色,RGB格式, color是一個(gè)不可增刪的數(shù)組
    color = (0, 255, 0)
    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 讀取一幀數(shù)據(jù)
        if not ok:
            break
        # 將當(dāng)前楨圖像轉(zhuǎn)換成灰度圖像
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects) > 0:  # 大于0則檢測(cè)到人臉
            for faceRect in faceRects:  # 單獨(dú)框出每一張人臉
                x, y, w, h = faceRect
                num = num + 1
                # 將當(dāng)前幀保存為圖片
                img_name = "%s/%d.jpg" % (path_name, num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
                # 延遲 60s,不要太頻繁的發(fā)送,知道來(lái)了就可以了
                # time.sleep(60)
                # 畫出矩形框
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
                # 顯示當(dāng)前捕捉到了多少人臉圖片了
                font = cv2.FONT_HERSHEY_SIMPLEX
                cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
        # 顯示圖像 Linux 下注釋掉即可
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break
    # 釋放攝像頭并銷毀所有窗口
    cap.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    camera("watchdog", os.getcwd()+"/face")

代碼解析

1. 導(dǎo)入必要的模塊

# -*- coding: utf-8 -*-
# import 進(jìn)openCV的庫(kù)
import cv2
import os
import time
  • # -*- coding: utf-8 -*-:指定文件編碼為 UTF-8。
  • import cv2:導(dǎo)入 OpenCV 庫(kù),用于圖像處理和人臉檢測(cè)。
  • import os:導(dǎo)入 os 模塊,用于文件路徑操作。
  • import time:導(dǎo)入 time 模塊,用于延遲操作。

2. 定義 camera 函數(shù)

def camera(window_name, path_name):
  • def camera(window_name, path_name)::定義一個(gè)名為 camera 的函數(shù),參數(shù) window_name 是窗口名稱,path_name 是保存截圖的路徑。

3. 創(chuàng)建窗口

    # Linux 不顯示圖形界面
    cv2.namedWindow(window_name)
  • cv2.namedWindow(window_name):創(chuàng)建一個(gè)窗口,用于顯示視頻流。在 Linux 下可以注釋掉這行代碼以不顯示圖形界面。

4. 打開(kāi)攝像頭

    # 視頻來(lái)源,來(lái)自USB攝像頭
    cap = cv2.VideoCapture(0)
  • cv2.VideoCapture(0):打開(kāi)默認(rèn)攝像頭。參數(shù) 0 表示默認(rèn)攝像頭。

5. 加載人臉識(shí)別分類器

    # 告訴OpenCV使用人臉識(shí)別分類器
    classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")
  • cv2.CascadeClassifier(...):加載預(yù)訓(xùn)練的 Haar 級(jí)聯(lián)分類器,用于檢測(cè)人臉。
  • os.getcwd()+"/haarcascade_frontalface_alt.xml":指定分類器文件的路徑。

6. 設(shè)置邊框顏色

    # 識(shí)別出人臉后要畫的邊框的顏色,RGB格式, color是一個(gè)不可增刪的數(shù)組
    color = (0, 255, 0)
  • color = (0, 255, 0):定義邊框顏色為綠色。

7. 主循環(huán)

    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 讀取一幀數(shù)據(jù)
        if not ok:
            break
        # 將當(dāng)前楨圖像轉(zhuǎn)換成灰度圖像
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects) > 0:  # 大于0則檢測(cè)到人臉
            for faceRect in faceRects:  # 單獨(dú)框出每一張人臉
                x, y, w, h = faceRect
                num = num + 1
                # 將當(dāng)前幀保存為圖片
                img_name = "%s/%d.jpg" % (path_name, num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
                # 延遲 60s,不要太頻繁的發(fā)送,知道來(lái)了就可以了
                # time.sleep(60)
                # 畫出矩形框
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
                # 顯示當(dāng)前捕捉到了多少人臉圖片了
                font = cv2.FONT_HERSHEY_SIMPLEX
                cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
        # 顯示圖像 Linux 下注釋掉即可
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break
  • num = 0:初始化計(jì)數(shù)器。
  • while cap.isOpened()::進(jìn)入無(wú)限循環(huán),實(shí)時(shí)讀取攝像頭圖像。
  • ok, frame = cap.read():從攝像頭讀取一幀圖像。
  • if not ok::檢查讀取是否成功,如果失敗則退出循環(huán)。
  • grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY):將圖像轉(zhuǎn)換為灰度圖像。
  • faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)):檢測(cè)圖像中的人臉。
  • if len(faceRects) > 0::檢查是否檢測(cè)到人臉。
  • for faceRect in faceRects::遍歷檢測(cè)到的每個(gè)人臉。
  • x, y, w, h = faceRect:獲取人臉的位置和大小。
  • num = num + 1:增加計(jì)數(shù)器。
  • img_name = "%s/%d.jpg" % (path_name, num):生成保存圖像的文件名。
  • image = frame[y - 10: y + h + 10, x - 10: x + w + 10]:裁剪人臉區(qū)域并擴(kuò)大邊界。
  • cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9]):保存圖像。
  • cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2):在圖像上繪制矩形框。
  • font = cv2.FONT_HERSHEY_SIMPLEX:設(shè)置字體樣式。
  • cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4):在圖像上顯示當(dāng)前捕捉到的人臉數(shù)量。
  • cv2.imshow(window_name, frame):顯示帶有矩形標(biāo)記的圖像。
  • c = cv2.waitKey(10):等待 10 毫秒,等待用戶按鍵。
  • if c & 0xFF == ord('q')::按 ‘q’ 鍵退出循環(huán)。

8. 釋放資源

    # 釋放攝像頭并銷毀所有窗口
    cap.release()
    cv2.destroyAllWindows()
  • cap.release():釋放攝像頭資源。
  • cv2.destroyAllWindows():關(guān)閉所有 OpenCV 窗口。

9. 主程序入口

if __name__ == '__main__':
    camera("watchdog", os.getcwd()+"/face")
  • if __name__ == '__main__'::檢查是否直接運(yùn)行此腳本。
  • camera("watchdog", os.getcwd()+"/face"):調(diào)用 camera 函數(shù),傳入窗口名稱和保存截圖的路徑。

完整代碼

# -*- coding: utf-8 -*-
# import 進(jìn)openCV的庫(kù)
import cv2
import os
import time
# 調(diào)用攝像頭檢測(cè)人臉并截圖
def camera(window_name, path_name):
    # Linux 不顯示圖形界面
    cv2.namedWindow(window_name)
    # 視頻來(lái)源,來(lái)自USB攝像頭
    cap = cv2.VideoCapture(0)
    # 告訴OpenCV使用人臉識(shí)別分類器
    classfier = cv2.CascadeClassifier(os.getcwd()+"/haarcascade_frontalface_alt.xml")
    # 識(shí)別出人臉后要畫的邊框的顏色,RGB格式, color是一個(gè)不可增刪的數(shù)組
    color = (0, 255, 0)
    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 讀取一幀數(shù)據(jù)
        if not ok:
            break
        # 將當(dāng)前楨圖像轉(zhuǎn)換成灰度圖像
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 人臉檢測(cè),1.2和2分別為圖片縮放比例和需要檢測(cè)的有效點(diǎn)數(shù)
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
        if len(faceRects) > 0:  # 大于0則檢測(cè)到人臉
            for faceRect in faceRects:  # 單獨(dú)框出每一張人臉
                x, y, w, h = faceRect
                num = num+1
                # 將當(dāng)前幀保存為圖片
                img_name = "%s/%d.jpg" % (path_name, num)
                image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                cv2.imwrite(img_name, image, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
                # 延遲 60s,不要太頻繁的發(fā)送,知道來(lái)了就可以了
                # time.sleep(60)
                # 畫出矩形框
                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
                # 顯示當(dāng)前捕捉到了多少人臉圖片了
                font = cv2.FONT_HERSHEY_SIMPLEX
                cv2.putText(frame, 'num:%d/1000' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
        # 顯示圖像 Linux 下注釋掉即可
        cv2.imshow(window_name, frame)
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break
    # 釋放攝像頭并銷毀所有窗口
    cap.release()
    cv2.destroyAllWindows()
if __name__ == '__main__':
    camera("watchdog", os.getcwd()+"/face")

測(cè)試

  • 確保你的攝像頭正常工作。
  • 運(yùn)行腳本:
python3 face_detection.py
  • 打開(kāi)攝像頭后,你會(huì)看到一個(gè)窗口顯示實(shí)時(shí)視頻流,并且在檢測(cè)到的人臉周圍繪制綠色矩形。
  • 按 ‘q’ 鍵退出程序。

總結(jié)

本文詳細(xì)介紹了如何使用 Python 和 OpenCV 庫(kù)實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖,并通過(guò)具體的代碼示例展示了整個(gè)過(guò)程。通過(guò)使用 cv2.VideoCapture 打開(kāi)攝像頭,cv2.CascadeClassifier 加載預(yù)訓(xùn)練的 Haar 級(jí)聯(lián)分類器,cv2.cvtColor 轉(zhuǎn)換圖像顏色空間,cv2.rectangle 繪制矩形,cv2.imwrite 保存圖像,最終實(shí)現(xiàn)了在實(shí)時(shí)視頻流中檢測(cè)并保存人臉圖像的功能。

到此這篇關(guān)于使用 Python 和 OpenCV 實(shí)現(xiàn)攝像頭人臉檢測(cè)并截圖的文章就介紹到這了,更多相關(guān)Python OpenCV 人臉檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套

    Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套

    這篇文章主要介紹了Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套 的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • OpenCV圖像處理之自定義濾波

    OpenCV圖像處理之自定義濾波

    濾波處理分為兩大類:線性濾波和非線性濾波,OpenCV里有這些濾波的函數(shù),使用起來(lái)非常方便,這篇文章主要給大家介紹了關(guān)于OpenCV圖像處理之自定義濾波的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python使用lxml模塊和Requests模塊抓取HTML頁(yè)面的教程

    Python使用lxml模塊和Requests模塊抓取HTML頁(yè)面的教程

    用Pyhton自帶的urllib或urllib2模塊抓取網(wǎng)頁(yè)或許有些陳詞濫調(diào)了,今天我們就來(lái)玩兒些新鮮的,來(lái)看Python使用lxml模塊和Requests模塊抓取HTML頁(yè)面的教程:
    2016-05-05
  • Python 使用xlwt模塊將多行多列數(shù)據(jù)循環(huán)寫入excel文檔的操作

    Python 使用xlwt模塊將多行多列數(shù)據(jù)循環(huán)寫入excel文檔的操作

    這篇文章主要介紹了Python 使用xlwt模塊將多行多列數(shù)據(jù)循環(huán)寫入excel文檔的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Python使用melt和pivot實(shí)現(xiàn)DataFrame格式轉(zhuǎn)換

    Python使用melt和pivot實(shí)現(xiàn)DataFrame格式轉(zhuǎn)換

    在數(shù)據(jù)處理與分析中,經(jīng)常遇到數(shù)據(jù)需要進(jìn)行格式轉(zhuǎn)換的情況,例如將數(shù)據(jù)從寬表格式轉(zhuǎn)換為長(zhǎng)表格式,或?qū)?shù)據(jù)重新分組匯總,Pandas提供了豐富的reshape操作,尤其是melt和pivot這兩個(gè)函數(shù),使得DataFrame可以在寬表與長(zhǎng)表之間高效轉(zhuǎn)換,本文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • 如何將yolov5中的PANet層改為BiFPN詳析

    如何將yolov5中的PANet層改為BiFPN詳析

    現(xiàn)在yolov5的neck用的是PANet,在efficient論文中提出了BiFPN結(jié)構(gòu),還有更加不錯(cuò)的性能,下面這篇文章主要給大家介紹了關(guān)于如何將yolov5中的PANet層改為BiFPN的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 詳解如何用Python寫個(gè)聽(tīng)小說(shuō)的爬蟲(chóng)

    詳解如何用Python寫個(gè)聽(tīng)小說(shuō)的爬蟲(chóng)

    在路上經(jīng)常發(fā)現(xiàn)好多人都喜歡用耳機(jī)聽(tīng)小說(shuō),同事居然可以一整天的帶著一只耳機(jī)聽(tīng)小說(shuō)。本文就用Python爬蟲(chóng)實(shí)現(xiàn)下載聽(tīng)小說(shuō)tingchina.com的音頻,需要的可以參考一下
    2022-02-02
  • Python圖像處理Pillow庫(kù)的安裝使用

    Python圖像處理Pillow庫(kù)的安裝使用

    本文詳細(xì)介紹了Python第三方庫(kù)Pillow的使用,通過(guò)導(dǎo)入Pillow庫(kù)、打開(kāi)和保存圖像、基本圖像操作以及圖像處理高級(jí)功能的代碼示例,我們了解了Pillow庫(kù)的強(qiáng)大功能和靈活性,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • Python字符串len()、split()、join()深度解析

    Python字符串len()、split()、join()深度解析

    在Python的字符串江湖中,len()、split()、join()三大方法如同倚天劍、屠龍刀、玄鐵重劍,看似簡(jiǎn)單卻暗藏玄機(jī),本文將通過(guò)實(shí)戰(zhàn)案例,帶您領(lǐng)略這些方法的精妙之處,需要的朋友可以參考下
    2025-04-04
  • Python下簡(jiǎn)易的單例模式詳解

    Python下簡(jiǎn)易的單例模式詳解

    這篇文章主要介紹了Python下簡(jiǎn)易的單例模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

湘潭县| 高邑县| 泸州市| 长治县| 景洪市| 礼泉县| 长春市| 奉贤区| 高密市| 佛学| 梧州市| 荆州市| 绥滨县| 道真| 隆林| 长岭县| 灵山县| 壶关县| 会同县| 札达县| 潍坊市| 简阳市| 乌兰察布市| 青铜峡市| 宾阳县| 时尚| 云龙县| 澜沧| 卢龙县| 若羌县| 舒城县| 甘孜县| 百色市| 桐城市| 泽库县| 宜州市| 南阳市| 任丘市| 赤峰市| 乐至县| 克拉玛依市|