有時我們在網路上分享照片的時候,如果不希望把家人合照或獨照的照片也分享出來,如何把這些照片惕除呢?或是反過來說,如何從一大堆照片中把沒有正面合照的照片找出來呢?答案就在我們之前所介紹的人臉偵測的程式。

在這一篇文章中,我們把之前的人臉偵測程式包成一個叫做num_faces的函數,只要傳一個照片檔案給它,它就會傳回這張照片中有多少張臉。有了這個功能之後,我們就可以搭配Python的檔案操作功能,把指定目錄的所有圖形檔一個一個地傳到這個函數中,只要傳回的值是0就表示它沒有在這張照片中找到任何一張臉,那麼這個檔案就是我們要的檔案,再把此檔案複製到另外一個目錄就可以了。

因此,我們的程式需要兩個參數,一個是要被分類的圖形檔所在目錄,而另外一個則是用來存放所有找不到臉的圖形檔案,也就是我們要找的對象。執行方法如下:

python get_nonface_images.py surce_images targe_path

只要有被找出來的檔案在複製之前也都會顯示在螢幕上,因此你可以在執行的過程中檢視它的執行進度。

# Program Name: get_nonface_images.py
# Author: skynet
# Date: 2015/10
# Usage: pythone get_nonface_images.py source_path target_path
# 
import cv2
import sys, glob, os, shutil

image_path = "source_images"
target_path = "nonface_images"
args = sys.argv
if len(args)>=3:
    if args[1][-1]=='/':
        image_path = args[1] + '*.jpg'
    else:
        image_path = args[1] + '/*.jpg'
    target_path = args[2]
else:
	print "Usage: python get_nonface_images.py source_path target_path"
	exit(0)

print image_path
print target_path
if not os.path.exists(target_path):
	os.mkdir(target_path)

casc_path = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(casc_path)

def num_faces(image_file):
	image = cv2.imread(image_file)
	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	faces = faceCascade.detectMultiScale(
    	gray,
    	scaleFactor=1.1,
    	minNeighbors=5,
    	minSize=(30,30),
    	flags = cv2.CASCADE_SCALE_IMAGE
	)
	return len(faces)

all_image_files = glob.glob(image_path)
for image_file in all_image_files:
	if num_faces(image_file) == 0:
		
		print "Copy ", image_file , "..."
		shutil.copy(image_file, target_path)

同樣地,要順利執行這個程式,一定要裝有OpenCV才行,當然,也要有Python的執行環境。另外,我們使用的是Python 2.7,如果是3.0版本的話,大概只要改幾個簡單的地方就好了,不過OpenCV要安裝成為在3.0下可以執行的版本,似乎不是那麼容易…

(275)

%d 位部落客按了讚: