objectdetection.VideoCap.java Source code

Java tutorial

Introduction

Here is the source code for objectdetection.VideoCap.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package objectdetection;

import com.sun.imageio.plugins.common.I18N;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.opencv.core.Core;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;

/**
 *
 * @author Daniel
 */
public class VideoCap {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    class Point {
        int x;
        int y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    Random rand = new Random();
    int id = 0;
    VideoCapture cap;
    Mat2Image mat2Img = new Mat2Image();
    int warna = 0;
    int tres = 0;

    ArrayList<ArrayList> daftar;
    ArrayList<ArrayList> akhir;

    int checked[][];
    Vector<Point> pointlist;

    VideoCap() {
        cap = new VideoCapture();
        //        cap.open(0);
    }

    public BufferedImage getOneFrame(int tres, String location, int cam, int mode) {
        this.tres = tres;
        BufferedImage img = null;
        if (cam == 1) {
            cap.open(0);
            cap.read(mat2Img.mat);
            Imgproc.cvtColor(mat2Img.mat, mat2Img.mat, Imgproc.COLOR_BGR2RGB);
            img = mat2Img.getImage(mat2Img.mat);
        } else {
            try {
                img = ImageIO.read(new File(location));
            } catch (IOException ex) {
                Logger.getLogger(VideoCap.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        BufferedImage hasil;
        //        int mode = 0;
        if (mode == 0) {
            hasil = split(img);
            System.out.println(daftar.size());
        } else {
            hasil = colorimage(img, tres);
        }

        return hasil;
    }

    public BufferedImage colorimage(BufferedImage img, int treshold) {
        BufferedImage temp = new BufferedImage(img.getWidth(), img.getHeight(), img.getType());

        checked = new int[img.getWidth()][img.getHeight()];
        pointlist = new Vector();

        for (int i = 0; i < img.getWidth(); i++) {
            for (int j = 0; j < img.getHeight(); j++) {
                checked[i][j] = 0;
            }
        }

        for (int x = 0; x < img.getWidth(); x++) {
            for (int y = 0; y < img.getHeight(); y++) {
                if (checked[x][y] == 0) {
                    Color color = new Color(img.getRGB(x, y));
                    pointlist.add(new Point(x, y));
                    search(img, temp, color, treshold);
                }
            }
        }

        return temp;
    }

    public void search(BufferedImage img, BufferedImage temp, Color color, int treshold) {
        while (pointlist.size() > 0) {
            Point p = pointlist.remove(0);
            if ((p.x >= 0) && (p.y >= 0) && (p.x < img.getWidth()) && (p.y < img.getHeight())) {
                if (checked[p.x][p.y] == 0) {
                    Color c = new Color(img.getRGB(p.x, p.y));
                    if (Math.abs(c.getRed() - color.getRed()) <= treshold
                            && Math.abs(c.getGreen() - color.getGreen()) <= treshold
                            && Math.abs(c.getBlue() - color.getBlue()) <= treshold) {
                        temp.setRGB(p.x, p.y, color.getRGB());
                        checked[p.x][p.y] = 1;

                        pointlist.add(new Point(p.x - 1, p.y - 1));
                        pointlist.add(new Point(p.x, p.y - 1));
                        pointlist.add(new Point(p.x + 1, p.y - 1));
                        pointlist.add(new Point(p.x - 1, p.y));
                        pointlist.add(new Point(p.x + 1, p.y));
                        pointlist.add(new Point(p.x - 1, p.y + 1));
                        pointlist.add(new Point(p.x, p.y + 1));
                        pointlist.add(new Point(p.x + 1, p.y + 1));
                    }
                }
            }
        }
    }

    public BufferedImage split(BufferedImage img) {
        BufferedImage temp = new BufferedImage(img.getWidth(), img.getHeight(), img.getType());
        daftar = new ArrayList<>();
        akhir = new ArrayList<>();
        process(img, 0, img.getWidth(), 0, img.getHeight());
        System.out.println("Merge");
        merge2();
        //        Integer warna;
        //        merge();
        for (int i = 0; i < akhir.size() - 1; i++) {

            int r = (Integer) akhir.get(i).get(4);
            int g = (Integer) akhir.get(i).get(5);
            int b = (Integer) akhir.get(i).get(6);
            //            int r = (Integer) akhir.get((int)akhir.get(i).get(7)).get(4);
            //            int g = (Integer) akhir.get((int)akhir.get(i).get(7)).get(5);
            //            int b = (Integer) akhir.get((int)akhir.get(i).get(7)).get(6);
            //            warna = (Integer) akhir.get(i).get(4);
            int start1 = (int) akhir.get(i).get(0);
            int start2 = (int) akhir.get(i).get(2);
            int end1 = (int) akhir.get(i).get(1);
            int end2 = (int) akhir.get(i).get(3);
            //        for (int i = 0; i < daftar.size(); i++) {
            //            int r = (Integer) daftar.get(i).get(4);
            //            int g = (Integer) daftar.get(i).get(5);
            //            int b = (Integer) daftar.get(i).get(6);
            ////            warna = (Integer) daftar.get(i).get(4);
            //            int start1 = (int) daftar.get(i).get(0);
            //            int start2 = (int) daftar.get(i).get(2);
            //            int end1 = (int) daftar.get(i).get(1);
            //            int end2 = (int) daftar.get(i).get(3);

            for (int j = start1; j < end1; j++) {
                for (int k = start2; k < end2; k++) {
                    //                    hasil.setRGB(j, k, new Color(warna, warna, warna).getRGB());

                    temp.setRGB(j, k, new Color(r, g, b).getRGB());
                }
            }
        }
        return temp;
    }

    public void process(BufferedImage img, int startWidth, int endWidth, int startHeight, int endHeight) {
        if (check(img, startWidth, endWidth, startHeight, endHeight) || Math.abs(startWidth - endWidth) <= 2
                || Math.abs(startHeight - endHeight) <= 2) {
            return;
        } else {
            process(img, startWidth, Math.abs((startWidth + endWidth) / 2), startHeight,
                    Math.abs((endHeight + startHeight) / 2));//kiri atas
            process(img, Math.abs((startWidth + endWidth) / 2), endWidth, startHeight,
                    Math.abs((endHeight + startHeight) / 2));//kanan atas
            process(img, startWidth, Math.abs((startWidth + endWidth) / 2), Math.abs((endHeight + startHeight) / 2),
                    endHeight);//kiri bawah
            process(img, Math.abs((startWidth + endWidth) / 2), endWidth, Math.abs((endHeight + startHeight) / 2),
                    endHeight);//kanan bawah
        }
    }

    public boolean check(BufferedImage img, int startWidth, int endWidth, int startHeight, int endHeight) {
        boolean same = true;
        Color c;
        int r = 0;
        int g = 0;
        int b = 0;
        int grayscale = 0;
        ArrayList<Integer> temp = new ArrayList<>();
        for (int i = startHeight; i < endHeight; i++) {
            for (int j = startWidth; j < endWidth; j++) {
                c = new Color(img.getRGB(j, i));
                r = c.getRed();
                g = c.getGreen();
                b = c.getBlue();
                grayscale = (r + g + b) / 3;

                int kiri, kanan, atas, bawah;
                if (j == 0) {
                    kiri = grayscale;
                } else {
                    c = new Color(img.getRGB(j - 1, i));
                    kiri = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
                }

                if (j == img.getWidth() - 1) {
                    kanan = grayscale;
                } else {
                    c = new Color(img.getRGB(j + 1, i));
                    kanan = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
                }

                if (i == 0) {
                    atas = grayscale;
                } else {
                    c = new Color(img.getRGB(j, i - 1));
                    atas = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
                }

                if (i == img.getHeight() - 1) {
                    bawah = grayscale;
                } else {
                    c = new Color(img.getRGB(j, i + 1));
                    bawah = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
                }

                if (Math.abs(grayscale - kiri) > tres || Math.abs(grayscale - kanan) > tres
                        || Math.abs(grayscale - atas) > tres || Math.abs(grayscale - bawah) > tres) {
                    same = false;
                    break;
                }
            }
            if (!same) {
                break;
            }
        }
        if (same) {
            int warna;
            temp.add(startWidth);
            temp.add(endWidth);
            temp.add(startHeight);
            temp.add(endHeight);
            warna = grayscale;
            //            temp.add(warna);
            temp.add(r);
            temp.add(g);
            temp.add(b);
            temp.add(id);
            id++;
            daftar.add(temp);
        }
        return same;
    }

    public boolean isNeighbour(ArrayList<Integer> p1, ArrayList<Integer> p2) {
        ArrayList<Integer> max;
        ArrayList<Integer> min;
        if ((p1.get(1) - p1.get(0)) > (p2.get(1) - p2.get(0))) {
            max = p1;
            min = p2;
        } else {
            max = p2;
            min = p1;
        }
        //        System.out.println(max.get(0) + " " + max.get(1) + " " + max.get(2) + " " + max.get(3));
        //        System.out.println(min.get(0) + " " + min.get(1) + " " + min.get(2) + " " + min.get(3));
        if (min.get(2) >= max.get(2) && min.get(3) <= max.get(3)) {
            //            System.out.println("horizontal");
            if (min.get(0) == max.get(1) || max.get(0) == min.get(1)) {
                return true;
            }
            return false;
        }
        if (min.get(0) >= max.get(0) && min.get(1) <= max.get(1)) {
            if (min.get(2) == max.get(3) || max.get(2) == min.get(3)) {
                return true;
            }
        }
        return false;
    }

    public void merge2() {
        ArrayList<ArrayList> merge = new ArrayList();
        System.out.println("cek tetangga");
        for (int i = 0; i < daftar.size() - 1; i++) {
            ArrayList<Integer> tetangga = new ArrayList();
            tetangga.add(i);
            for (int j = (i + 1); j < daftar.size(); j++) {
                if (isNeighbour(daftar.get(i), daftar.get(j))) {
                    tetangga.add(j);
                }
            }
            merge.add(tetangga);
        }
        int[] id = new int[daftar.size()];
        System.out.println("prepare id");
        for (int i = 0; i < id.length; i++) {
            id[i] = -1;
        }
        int pk = 0;
        System.out.println("gabung by id");
        for (int i = 0; i < merge.size(); i++) {
            int r = (Integer) daftar.get(i).get(4);
            int g = (Integer) daftar.get(i).get(5);
            int b = (Integer) daftar.get(i).get(6);
            int gray = (r + g + b) / 3;
            if (id[i] == -1) {
                id[i] = pk;
                pk++;
            }
            //            System.out.println(i + " - " + pk + " - ");
            for (int j = 1; j < merge.get(i).size(); j++) {
                int change = (Integer) merge.get(i).get(j);
                int rj = (Integer) daftar.get(change).get(4);
                int gj = (Integer) daftar.get(change).get(5);
                int bj = (Integer) daftar.get(change).get(6);
                int grayj = (rj + gj + bj) / 3;
                //                System.out.println("  " + grayj);
                if (Math.abs(gray - grayj) < tres) {
                    id[change] = id[i];
                }
            }
        }
        //        for (int i = 0; i < id.length; i++) {
        //            System.out.println(i + " ID : " + id[i]);
        //        }
        System.out.println("pecah warna");
        ArrayList<ArrayList> warna = new ArrayList();
        //        System.out.println(pk);
        for (int i = 0; i < pk; i++) {
            ArrayList<Integer> temp = new ArrayList();
            int r = 0;
            int g = 0;
            int b = 0;
            int count = 0;
            for (int j = 0; j < id.length; j++) {
                if (id[j] == i) {
                    count++;
                    r = r + (Integer) daftar.get(j).get(4);
                    g = g + (Integer) daftar.get(j).get(5);
                    b = b + (Integer) daftar.get(j).get(6);
                }
            }
            temp.add(r / count);
            temp.add(g / count);
            temp.add(b / count);
            warna.add(temp);
        }
        System.out.println("add ke akhir");
        for (int i = 0; i < id.length; i++) {
            ArrayList<Integer> temp = new ArrayList();
            temp.add((Integer) daftar.get(i).get(0));
            temp.add((Integer) daftar.get(i).get(1));
            temp.add((Integer) daftar.get(i).get(2));
            temp.add((Integer) daftar.get(i).get(3));
            for (int j = 0; j < pk; j++) {
                if (id[i] == j) {
                    temp.add((Integer) warna.get(j).get(0));
                    temp.add((Integer) warna.get(j).get(1));
                    temp.add((Integer) warna.get(j).get(2));
                }
            }
            akhir.add(temp);
        }
    }

    public void merge() {
        ArrayList<Integer> temp;
        int gray;
        int gray2;
        for (int i = 0; i < daftar.size(); i++) {
            gray = ((int) daftar.get(i).get(4) + (int) daftar.get(i).get(5) + (int) daftar.get(i).get(6)) / 3;
            akhir.add(daftar.get(i));
            for (int j = i; j < daftar.size(); j++) {
                gray2 = ((int) daftar.get(j).get(4) + (int) daftar.get(j).get(5) + (int) daftar.get(j).get(6)) / 3;
                temp = new ArrayList<>();
                if (Math.abs(gray - gray2) < 5) {
                    temp.add((Integer) daftar.get(j).get(0));
                    temp.add((Integer) daftar.get(j).get(1));
                    temp.add((Integer) daftar.get(j).get(2));
                    temp.add((Integer) daftar.get(j).get(3));
                    temp.add((Integer) daftar.get(j).get(4));
                    temp.add((Integer) daftar.get(j).get(5));
                    temp.add((Integer) daftar.get(j).get(6));
                    temp.add((Integer) daftar.get(i).get(7));
                    akhir.add(temp);
                }
            }

            //            if (Math.abs((int) daftar.get(i).get(4) - (int) daftar.get(i + 1).get(4)) < 10) {
            //                temp.add((Integer) daftar.get(i).get(0));
            //                temp.add((Integer) daftar.get(i + 1).get(1));
            //                temp.add((Integer) daftar.get(i).get(2));
            //                temp.add((Integer) daftar.get(i + 1).get(3));
            //                temp.add((Integer) daftar.get(i).get(4));
            //                temp.add((Integer) daftar.get(i).get(5));
            //                temp.add((Integer) daftar.get(i).get(6));
            //                akhir.add(temp);
            //            }
        }
    }

    public void close() {
        cap.release();
    }
}