3

ここに画像の説明を入力顔の特定の領域を抽出するために D-lib を使用しています。dlibランドマークポイント検出器を使用して検出された領域を切り抜くためにopencvを使用しています。ただし、トリミングされた画像は青色です。変更の理由について何か考えはありますか?また、一部の画像がこのコードをスキップしていることもわかりました。たとえば、ソース フォルダーに 20 個の画像がある場合、それらを dlib 検出器で実行した後、すべての入力から 2 つの画像を抽出しているため、宛先フォルダーに 40 個の結果の画像を取得する必要があります。しかし、そうではありません。15〜20枚の画像しか取得していません。しかし、それらはプログラムで実行されており、私のプログラムに追加された例外ではありません。

以下の私のコードを見つけてください:- また、添付の画像を見つけてください。

import sys
import os
import dlib
import glob
from skimage import io
import cv2



predictor_path = "/home[![enter image description here][1]][1]/PycharmProjects/Face_recognition/shape_predictor_68_face_landmarks.dat"
faces_folder_path = "/media/External_HDD/My_files/Datasets"

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
win = dlib.image_window()
a=[]
number=1
scanned=1
for f in glob.glob(os.path.join(faces_folder_path, "*.png")):
    print("Processing file: {}".format(f))

    img = io.imread(f)
    name=f[-14:-4]
    print("Number of images scanned is :",scanned)
    scanned=scanned+1
    win.clear_overlay()
    win.set_image(img)

    # Ask the detector to find the bounding boxes of each face. The 1 in the
    # second argument indicates that we should upsample the image 1 time. This
    # will make everything bigger and allow us to detect more faces.
    dets = detector(img, 1)
    print("Number of faces detected: {}".format(len(dets)))
    if len(dets)>1:
        print ("The file has an anomaly")
        a.append(name)
        print("The number of anomalies detected: {}".format(len(a)))
        continue
    for k, d in enumerate(dets):
        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
            k, d.left(), d.top(), d.right(), d.bottom()))
        # Get the landmarks/parts for the face in box d.
        shape = predictor(img, d)
        print("Part 0: {}, Part 1: {} ...".format(shape.part(0),
                                                  shape.part(1)))
        print ("Part 27: {}, Part 19: {}, Part 0: {}, Part 28: {}".format(shape.part(27),shape.part(19),shape.part(0),shape.part(28)))
        left_corner= shape.part(17)
        left_x= left_corner.x
        left_y=left_corner.y
        left_y=left_y-200

        center=shape.part(29)
        center_x=center.x
        center_y=center.y
        print (left_x,left_y)
        print (center_x,center_y)

        right_crop_center_x=center_x
        right_crop_center_y=center_y-700
        right=shape.part(15)
        right_x=right.x
        right_x=right_x-200
        right_y=right.y
        os.chdir("/home/PycharmProjects/cropped")

        win.add_overlay(shape)
        crop_left= img[left_y:center_y,left_x:center_x]
        # cv2.imshow("cropped_left", crop_left)
        cv2.imwrite(name + "_crop_left" +".png" ,crop_left)

        crop_right=img[right_crop_center_y:right_y,right_crop_center_x:right_x]
        # cv2.imshow("cropped_right", crop_right)
        cv2.imwrite(name + "_crop_right" +".png",crop_right)
        print("Number of images completed is :{}".format(number))
        number = number + 1
        cv2.waitKey(2)
        print len(a)
4

2 に答える 2

4

Python に次のコード行を含めて、画像を BGR から RGB に変換します。

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
于 2016-12-10T00:54:42.303 に答える
1

コメントで述べたように、直面している問題は、画像の赤と青のチャンネルが入れ替わっていることです。これを修正するには、cvtColor関数を使用する必要があります。以下は、これを修正する C++ コードです (現在、Python で OpenCV にアクセスすることはできません)。

#include <cv.h>
#include <highgui.h>

int main()
{
    cv::Mat bgrImage = cv::imread("inImage.png");

    cv::Mat rgbImage;

    cv::cvtColor(bgrImage, rgbImage, CV_BGR2RGB);

    cv::imshow("BGR Output", bgrImage);
    cv::imshow("RGB Processed", rgbImage);

    cv::waitKey(0);
    return 1;
}

出力画像は次のとおりです。 ここに画像の説明を入力

于 2016-10-27T21:58:11.590 に答える