Beispiel #1
0
    def blur_video(self, filename):
        cap = cv.VideoCapture(filename=filename)
        time.sleep(2)
        frame_width = int(cap.get(3))
        frame_height = int(cap.get(4))
        print(frame_width, frame_height)


        out = cv.VideoWriter('outpy.mp4', cv.VideoWriter_fourcc(*'MP4V'), 20, (frame_width, frame_height))

        net = cv.dnn.readNet(self.prototxtPath, self.weightsPath)
        if (cap.isOpened() == False):
            print("Unable to read camera feed")
            return

        val = True
        while val:
            ret, frame = cap.read()
            if not val:
                break

            else:
                cv.imshow('frame', frame)
                frame = imutils.resize(frame, width=400)

                (h, w) = frame.shape[:2]
                blob = cv.dnn.blobFromImage(frame, 1.0, (300, 300), (104.0, 177.0, 123.0))

                # pass the blob through the network and obtain the face detections
                net.setInput(blob)
                detections = net.forward()

                # loop over the detections
                for i in range(0, detections.shape[2]):
                    # extract the confidence (i.e., probability) associated with
                    # the detection
                    confidence = detections[0, 0, i, 2]

                    # filter out weak detections by ensuring the confidence is
                    # greater than the minimum confidence
                    if confidence > .2:
                        # compute the (x, y)-coordinates of the bounding box for
                        # the object
                        box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
                        (startX, startY, endX, endY) = box.astype("int")
                        # extract the face ROI
                        face = frame[startY:endY, startX:endX]
                        face = anonymize_face_pixelate(face)
                        # store the blurred face in the output image
                        frame[startY:endY, startX:endX] = face
                out.write(frame)

        cap.release()
        out.release()
        cv.destroyAllWindows()
Beispiel #2
0
def obscure_objects(cascade, img, gray, w, h):
    object_w = w
    object_h = h
    # Detect the objects
    objects = cascade.detectMultiScale(gray, 1.1, 4)
    #objects = numpy.array(objects)
    try:
        print(objects.shape)
    except AttributeError:
        print("No objects in frame...")
        return False
    # Draw the rectangle around each face
    merged = Image.new('RGB', (object_w, object_h))
    ROI_Collage = numpy.copy(numpy.zeros(
        img.shape,
        dtype=numpy.uint8))  #(face_h, object_w*objects.shape[0]/2,3)
    #print(str(ROI_Collage.shape) + " --- " + str(img.shape))
    prevX = 0
    prevY = 0
    count = 1

    for (x, y, w, h) in objects:
        print(count)
        ROI = numpy.copy(img[y:y + h, x:x + w])
        ROI_Collage[prevY:prevY + object_h,
                    prevX:prevX + object_w] = cv2.resize(
                        img[y:y + h, x:x + w], (object_h, object_w))
        prevX = prevX + object_w
        blur = numpy.copy(
            anonymize_face_simple(anonymize_face_pixelate(ROI, 9), 3.0))
        if (prevX + w > ROI_Collage.shape[1]):
            prevX = 0
            prevY = prevY + object_h
        elif (prevY + h > ROI_Collage.shape[0]):
            prevY = 0
            prevX = 0

        img[y:y + h, x:x + w] = numpy.copy(blur)
        count = count + 1
    print("Merging...")
    new_image = hide_subimage.merge_images(
        Image.fromarray(numpy.uint8(img)),
        Image.fromarray(numpy.uint8(ROI_Collage)))

    return new_image
Beispiel #3
0
def main():
    cfg = anyconfig.load('settings.yaml')
    cfg = munch.munchify(cfg)  
    detector = FaceDetector(cfg.face_detector.model_path, -1)
    for ext in exts:
        image_list.extend(glob.glob(os.path.join(image_dir, ext)))
    for image_path in image_list:
        filename = image_path.split('/')[-1] #os should be linux
        image = cv2.imread(image_path)
        bboxes, facial_lanmarks = detector.detect(image[:, :, ::-1], 1.0)
        for i, bbox in enumerate(bboxes):
            conf_score = bbox[4]
            if conf_score < cfg.face_detector.confident_score_threshold:
                continue
            xmin, ymin, xmax, ymax = [int(val) for val in bbox[:4]]
            # cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 3)
            face = image[ymin:ymax, xmin:xmax]
            image[ymin:ymax, xmin:xmax] = anonymize_face_pixelate(face)
        cv2.imwrite(os.path.join(output_dir, filename), image)
def blur_face_video(args, net, is_rot90=True):
    """
    動画で、ssdで顔検出して、opencvのガウシアンブラーで顔だけぼかす
    動画ロード/保存は http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html を参考にした
    """
    print("[INFO] starting video stream...")

    # 出力画像サイズ取得する
    cap = cv2.VideoCapture(args['video'])
    ret, frame = cap.read()
    frame = imutils.resize(frame, width=400)
    (h, w) = frame.shape[:2]
    print('h w:', h, w)
    cap.release()

    # 画像回転させるか
    out_h_w = (int(h), int(w)) if is_rot90 else (int(w), int(h))

    # Define the codec and create VideoWriter object
    # http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html
    fourcc = cv2.VideoWriter_fourcc(*'DIVX')
    out = cv2.VideoWriter(
        (os.path.join(
            args['output_dir'],
            pathlib.Path(args['video']).stem + '_blur.mp4')),  # '_blur.avi'
        fourcc,
        20.0,  # フレームレート
        out_h_w  # 画像サイズあってないと保存できない!!!!!
    )
    cap = cv2.VideoCapture(args['video'])
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    for f_c in range(frame_count):
        try:
            # スレッドされた動画ストリームからフレームを取得し、最大幅が400ピクセルになるようにリサイズ
            ret, frame = cap.read()
            frame = imutils.resize(frame, width=400)
            # フレームの寸法を取得し、そこからブロブを作成
            (h, w) = frame.shape[:2]
        except Exception:
            print(f_c)
            traceback.print_exc()
            break

        # OpenCVでテンソル作成?
        blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),
                                     (104.0, 177.0, 123.0))

        # ネットワークを介してブロブを通過させ、顔検出を取得
        net.setInput(blob)
        detections = net.forward()

        # 検出されたものをループ
        for i in range(0, detections.shape[2]):
            # 検出に関連する信頼度(すなわち,確率)を抽出
            confidence = detections[0, 0, i, 2]

            #  信頼度が最小信頼度よりも大きいことを確認することで,弱い検出をフィルタリング
            if confidence > args["confidence"]:
                # オブジェクトのバウンディングボックスの (x, y)座標を計算
                box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
                (startX, startY, endX, endY) = box.astype("int")

                # 顔のROIを抽出
                face = frame[startY:endY, startX:endX]

                # シンプルな顔のぼかし方を適用しているかどうかを確認
                if args["method"] == "simple":
                    face = anonymize_face_simple(face, factor=3.0)
                # そうでなければ、"ピクセル化された "顔の匿名化メソッドを適用
                else:
                    face = anonymize_face_pixelate(face, blocks=args["blocks"])

                # 出力画像にぼかした顔を保存
                frame[startY:endY, startX:endX] = face

        # 縦動画の縦横が逆になってしまったので、270度回転  https://oliversi.com/2019/01/16/python-opencv-movie2/
        if is_rot90:
            frame = np.rot90(frame, 3)

        # write the flipped frame
        # print(frame.shape)
        out.write(frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 掃除をする
    cap.release()
    out.release()
    cv2.destroyAllWindows()
def blur_face_camera(args, net):
    """
    カメラを使ってリアルタイムで、ssdで顔検出して、opencvのガウシアンブラーで顔だけぼかす
    """
    # ビデオストリームを初期化し, カメラセンサーがウォームアップ
    print("[INFO] starting video stream...")
    vs = VideoStream(src=0).start()
    time.sleep(2.0)

    # ビデオストリームのフレームをループ
    while True:
        # スレッドされた動画ストリームからフレームを取得し、最大幅が400ピクセルになるようにリサイズ
        frame = vs.read()
        frame = imutils.resize(frame, width=400)

        # フレームの寸法を取得し、そこからブロブを作成
        (h, w) = frame.shape[:2]
        # OpenCVでテンソル作成?
        blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),
                                     (104.0, 177.0, 123.0))

        # ネットワークを介してブロブを通過させ、顔検出を取得
        net.setInput(blob)
        detections = net.forward()

        # 検出されたものをループ
        for i in range(0, detections.shape[2]):
            # 検出に関連する信頼度(すなわち,確率)を抽出
            confidence = detections[0, 0, i, 2]

            #  信頼度が最小信頼度よりも大きいことを確認することで,弱い検出をフィルタリング
            if confidence > args["confidence"]:
                # オブジェクトのバウンディングボックスの (x, y)座標を計算
                box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
                (startX, startY, endX, endY) = box.astype("int")

                # 顔のROIを抽出
                face = frame[startY:endY, startX:endX]

                # シンプルな顔のぼかし方を適用しているかどうかを確認
                if args["method"] == "simple":
                    face = anonymize_face_simple(face, factor=3.0)

                # そうでなければ、"ピクセル化された "顔の匿名化メソッドを適用
                else:
                    face = anonymize_face_pixelate(face, blocks=args["blocks"])

                # 出力画像にぼかした顔を保存
                frame[startY:endY, startX:endX] = face

        #  出力フレームを表示
        cv2.imshow("Frame", frame)
        key = cv2.waitKey(1) & 0xFF

        # qキーが押された場合、ループから抜け出す
        if key == ord("q"):
            break

    # 掃除をする
    cv2.destroyAllWindows()
    vs.stop()