【Python】opencv_pythonの画像をface_recognitionに受け渡す

webカメラの画像をface_recognitionで処理したい

と、思ったときにwebカメラからの画像の取得はface_recognitonでサポートされていませんので、それが可能なopencv_pythonと連携させることを思いつきます。

そこで、opencv_pythonで読み込んだ画像を直接face_recognitonに渡す方法を調査しました。

どちらも只のnumpy配列ですが

face_recognitonの公式ドキュメントを参照すると、通常のload_image_fileの返り値は「RGB」のnumpy配列です。

一方でopencv_pythonのcv2.imread()は、同様にnumpy配列ですが、「RGB」ではなく「BGR」のnumpy配列です。

BGRからRGBに変えてあげる

なので、opencvで取得した「BGR」のnumpy配列の並びを「RGB」に変更してあげれば、そのままface_recognitionで使うことができます。以下はopencv_pythonでwebカメラから取得したフレームをface_recognitionで処理する例です。

import cv2
import argparse
import face_recognition

def main_loop(cap):

    ret, frame = cap.read()
    rgb_frame = frame[:, :, ::-1] #BGRをRGBすることでface_recognitionで使えるようになる。

  face_loc_list = face_recognition.face_locations(rgb_frame, model="hog") #顔位置取得
    #など、rgb_frameはface_recognitonで処理できるので、色々できます。

    cv2.imshow('result',frame)

if __name__ == '__main__':

    #Webカメラ読み込み&ループ
    cap = cv2.VideoCapture(0)

    while True:
        main_loop(cap)
        key = cv2.waitKey(200)
        if key == 27:
            break

    cap.release()
    cv2.destroyAllWindows()

「rgb_frame = frame[:, :, ::-1]」としてopencv_python形式(frame)からface_recognitionの形式に変換しています。

以上です。