質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Java

    14437questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaFXを用いた映像から顔を検出しモザイクをかけるプログラム

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 338

tabasu

score 2

前提・実現したいこと

JavaFXを用いた映像から顔を検出し顔にモザイクをかけるプログラムを作成しています。
実行するとウィンドウが出てきてそこにカメラが映している映像が流れ、顔の部分に長方形が出るようになっています。今回お聞きしたいのは、この映像をモザイクにするメソッドを作成しモザイク処理ができるようにしたいです。よろしくお願いします。

該当のソースコード

//記述言語 java

import java.io.ByteArrayInputStream;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class NewClass extends Application{
   private int camWidth;
   private int camHeight;
   VideoCapture capture;
   Canvas canvas;
   GraphicsContext gc;
   Stage stage;
   AnimationTimer timer;


   @Override
   public void start(Stage stage){
   this.stage=stage;
   initOpenCv();

   canvas = new Canvas(camWidth,camHeight);
   gc = canvas.getGraphicsContext2D();
   Group group = new Group(canvas);
   Scene scene = new Scene(group,camWidth,camHeight);
   stage.setScene(scene);
   stage.show();
   timer = new CameraAnimation();
   timer.start();
}
private static Mat dObj(CascadeClassifier objDetector,Mat src){
       Mat dst = src.clone();
       MatOfRect objDetections = new MatOfRect();
       objDetector.detectMultiScale(dst,objDetections);
       System.out.println("Detected"+objDetections.toArray().length+"face");

       if(objDetections.toArray().length<=0) return src;
       for(Rect rect : objDetections.toArray()){
           Imgproc.rectangle(dst,new Point(rect.x,rect.y),
                               new Point(rect.x+rect.width,rect.height),
                               new Scalar(0,0,255),2);
       }
       return dst;
   }
public void initOpenCv(){
   System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
   capture = new VideoCapture(0);
   System.out.println("Camera open: " + capture.isOpened());
   camWidth = (int)capture.get(Videoio.CAP_PROP_FRAME_WIDTH);
   camHeight = (int)capture.get(Videoio.CAP_PROP_FRAME_HEIGHT);
   stage .setOnCloseRequest(new EventHandler<WindowEvent>(){
       @Override
       public void handle(WindowEvent event){
           timer.stop();
           capture.release();
           System.out.println("Camera released");
       }
   });
}
   public class CameraAnimation extends AnimationTimer{
   Mat capImg = new Mat();
   Mat dst = new Mat();

   @Override
   public void handle(long now){
       Imgproc.rectangle(capImg,new Point(),new Point(),new Scalar(0,0,255,2));
       CascadeClassifier objDetector = new CascadeClassifier("haarcascade_frontalface_default.xml");
           if(objDetector.empty()) throw new RuntimeException("no xml file");
   capture.read(capImg);

   capImg = dObj(objDetector,capImg);
   Image img = mat2Image(capImg);   


       gc.drawImage(img,0,0);

   }
}
public static Image mat2Image(Mat mat){
   MatOfByte buffer = new MatOfByte();
Imgcodecs.imencode(".png",mat,buffer);
return new Image(new ByteArrayInputStream(buffer.toArray()));
}
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • KSwordOfHaste

    2017/12/28 19:08

    コードを拝見する限り殆どの描画制御をOpenCVで行っているように見えます。タイトルをJavaFX->OpenCVに変えた方がよいかも知れませんね。JavaFXでやるならCanvas上の画像をキャプチャーして低水準の画像処理を自前で書くようなイメージを持ちます。OpenCVを使っているのにわざわざJavaFX側でそんな面倒なことをするとは思えないのですが?

    キャンセル

  • 退会済みユーザー

    2017/12/29 00:16

    複数のユーザーから「意図的に内容が抹消された質問」という意見がありました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

まだ回答がついていません

同じタグがついた質問を見る

  • Java

    14437questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。