Package

Source Code of CameraImage

import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.imageio.stream.*;
import javax.imageio.ImageWriteParam;

public class CameraImage extends JPanel implements Serializable {

  //JFrame picker_f;
  boolean pickerStat;
  public int mm;
  int mmx, mmy, mmoldx, mmoldy;
  char bmask[][];
  int lm, lmIndex, tc;
  int width, height;
  int pixels[];
  int backup[];
  int mx,
    my,
    xcoord,
    ycoord,
    zcoord,
    oldz,
    oldx,
    oldy,
    x2coord,
    y2coord,
    oldx2,
    oldy2,
    conf;
  MemoryImageSource source;
  BufferedImage image;
  //Image offScreenImage;
  //Graphics offScreenGC;
  //zoomBox azoomBox;
  JLabel red_l, green_l, blue_l;
  JPanel colorBox;
  int frames, fps;
  long startTime;
  int start;
  int flipx, flipy;
  long wdTimer;
  int scale;
  int rmin[], rmax[], gmin[], gmax[], bmin[], bmax[];
  static int objDirt[];
  int size_x, size_y;
  int objnum;
  int obj_x[], obj_y[];
  int target_x, target_y;
  double my_turn, my_drive;
  JFrame channel_f;
  int cur_chan;
  CameraImage(int x, int y) {
    objnum = 0;
    target_y = 0;
    target_x = 0;
    flipx = 0;
    flipy = 0;
    cur_chan = 4;
    rmin = new int[3];
    rmax = new int[3];
    gmin = new int[3];
    gmax = new int[3];
    bmin = new int[3];
    bmax = new int[3];
    obj_x = new int[3];
    obj_y = new int[3];
    objDirt = new int[3];
    bmask = new char[10][48];
    my_drive = 0;
    lmIndex = 0;
    mmoldx = 0;
    mmoldy = 0;
    mmx = 0;
    mmy = 0;
    mm = 1;
    lm = 0;
    scale = 0;
    start = 1;
    zcoord = 0;
    xcoord = 0;
    ycoord = 0;
    x2coord = 0;
    y2coord = 0;
    oldx = 0;
    oldy = 0;
    oldx2 = 0;
    oldy2 = 0;
    oldz = 0;
    conf = 0;
    tc = 0;
    pickerStat = false;
    //picker_f = new JFrame("Color Picker");
    JPanel picker_p = new JPanel();
    red_l = new JLabel("0");
    green_l = new JLabel("0");
    blue_l = new JLabel("0");
    //azoomBox = new zoomBox();
    colorBox = new JPanel();
    colorBox.setPreferredSize(new Dimension(32,32));
    //picker_f.setBackground(Color.lightGray);
      GridLayout pickerLayout = new GridLayout(2, 4);
      pickerLayout.setHgap(5);
    picker_p.setLayout(pickerLayout);
   
    picker_p.add(new JLabel());
    picker_p.add(new JLabel("Red"));
    picker_p.add(new JLabel("Green"));
    picker_p.add(new JLabel("Blue"));
    picker_p.add(new JLabel());
    picker_p.add(red_l);
    picker_p.add(green_l);
    picker_p.add(blue_l);
    JPanel pickerb_p = new JPanel();
    pickerb_p.setBorder(
      BorderFactory.createTitledBorder(
        BorderFactory.createEtchedBorder(),
        "Color Picker"));
    pickerb_p.add(colorBox);
    pickerb_p.add(picker_p);
    //pickerb_p.setBackground(Color.gray);
    MainWindow.status_t = new JTextField("starting up...");
    JPanel finalPicker = new JPanel();
    GridLayout agl = new GridLayout(2, 1);
    agl.setVgap(20);

    finalPicker.add(pickerb_p);

    MainWindow.JPanel1.add(finalPicker);

    pickerStat = true;
    setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    enableEvents(
      AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
    //col=0;
    //row=0;
    this.setBackground(Color.black);
    width = x;
    height = y;
    pixels = new int[width * height];
    backup = new int[width * height];
    //  source = new MemoryImageSource(width,height,pixels,0,width);
    //source.setAnimated(true);
    //image=createImage(source);
    image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    image.setRGB(0, 0, width, height, pixels, 0, width);
    frames = 0;
    fps = 0;
    Date time = new Date();
    startTime = time.getTime();
    //myRaw = new rawWindow();
  }
  public void flip(int type) {
    int x, y;

    if (type == 0) {
      for (x = 0; x < width; x++)
        for (y = 0; y < height; y++) {
          backup[(y * width) + x] =
            pixels[(y * width) + (width - x - 1)];
        }
    } else {
      for (x = 0; x < width; x++)
        for (y = 0; y < height; y++) {
          backup[(y * width) + x] =
            pixels[((height - y - 1) * width) + x];
        }
    }

    for (x = 0; x < width * height; x++)
      pixels[x] = backup[x];
    image.setRGB(0, 0, width, height, pixels, 0, width);

    repaint();
  }

  public void setChannel(int chan) {
    int x;
    if (cur_chan == 4) {
      for (x = 0; x < width * height; x++)
        backup[x] = pixels[x];
    }

    int pix;
    int tmp;
    for (x = 0; x < width * height; x++) {
      cur_chan = chan;
      if (chan == 0) {
        tmp = backup[x] & 0xFF0000;
        pix = tmp | (tmp >> 8) | (tmp >> 16);
      } else if (chan == 1) {
        tmp = backup[x] & 0x00FF00;
        pix = tmp | (tmp << 8) | (tmp >> 8);
      } else if (chan == 2) {
        tmp = backup[x] & 0x0000FF;
        pix = tmp | (tmp << 8) | (tmp << 16);
      } else
        pix = backup[x];
      Color pixColor = new Color(pix);
      pixels[x] = pixColor.getRGB();
    }
    image.setRGB(0, 0, width, height, pixels, 0, width);

    repaint();
  }

  public void processEvent(AWTEvent e) {
    int r, g, b;
    mx = ((MouseEvent) e).getX();
    my = ((MouseEvent) e).getY();

    int tx, ty, pix, tmp;

    tx = mx - (getSize().width - width) / 2;
    ty = my - ((getSize().height - height) / 2) - 20;

    if (size_x == 160 && size_y == 288)
      ty -= 72; // Must be a type 4 mosaic
    if (size_x == 320 && size_y == 288)
      ty -= 72; // Must be a type 5 mosaic

    if (tx < 0 || ty < 0 || tx > width - 1 || ty > height - 1)
      pix = 0;
    else
      pix = pixels[ty * width + tx];
    Color pixColor = new Color(pix);
    colorBox.setBackground(pixColor);
    b = pix & 0xFF;
    blue_l.setText(String.valueOf(b));
    g = pix >> 8 & 0xFF;
    green_l.setText(String.valueOf(g));
    r = pix >> 16 & 0xFF;
    red_l.setText(String.valueOf(r));

    int button = ((MouseEvent) e).getButton();
    if (((MouseEvent) e).getClickCount() > 0 && button != 0) {

      if (my_drive != 0) {
      }
      if (button == 1) {

        objDirt[objnum] = 1;
        int tol = new Integer(MainWindow.tol_t.getText()).intValue();
        //int tol=25;
        rmin[objnum] = r - tol;
        if (rmin[objnum] < 0)
          rmin[objnum] = 0;
        rmax[objnum] = r + tol;
        if (rmax[objnum] > 255)
          rmax[objnum] = 255;
        gmin[objnum] = g - tol;
        if (gmin[objnum] < 0)
          gmin[objnum] = 0;
        gmax[objnum] = g + tol;
        if (gmax[objnum] > 255)
          gmax[objnum] = 255;
        bmin[objnum] = b - tol;
        if (bmin[objnum] < 0)
          bmin[objnum] = 0;
        bmax[objnum] = b + tol;
        if (bmax[objnum] > 255)
          bmax[objnum] = 255;
        MainWindow.rmin_t.setText(
          (new Integer(rmin[objnum])).toString());
        MainWindow.gmin_t.setText(
          (new Integer(gmin[objnum])).toString());
        MainWindow.bmin_t.setText(
          (new Integer(bmin[objnum])).toString());
        MainWindow.rmax_t.setText(
          (new Integer(rmax[objnum])).toString());
        MainWindow.gmax_t.setText(
          (new Integer(gmax[objnum])).toString());
        MainWindow.bmax_t.setText(
          (new Integer(bmax[objnum])).toString());
        int w_width = getSize().width;
        int w_height = getSize().height;

        int x_off = (w_width - width) / 2;
        int y_off = (w_height - height) / 2;

        obj_x[objnum] = mx - x_off;
        obj_y[objnum] = my - y_off;

      }
      if (objDirt[objnum] == 1) {
        int mmx = obj_x[objnum];
        if (my_drive == 0) {

        }

      }
      repaint();
    }
  }

  public void sendFrame(int chan) {
    int pix, x_off, y_off, x, y;
    int red, green, blue, data;
    int new_frame = 0, width_cnt;
    int x_max, y_max;

    //x_off=(width-size_x)/2;
    //y_off=(height-size_y)/2;
    for (x = 0; x < width * height; x++)
      pixels[x] = 0;
    x_off = 0;
    y_off = 0;
    x = 0;
    y = 0;
    width_cnt = 0;
    if (MainWindow.fs_c.getSelectedIndex() != 1) {
      MainWindow.mySerial.readACK(0);
      if (MainWindow.cameraVersion == 1)
        MainWindow.mySerial.write("df\r");
      else if (chan == 0)
        MainWindow.mySerial.write("sf\r");
      else {
        MainWindow.mySerial.write("sf " + (chan - 1) + "\r");
      }
    }
    MainWindow.status_t.setText("Frame Grab...");
    while (true) {
      //data=mainWindow.mySerial.sPort.readByte();
      data = MainWindow.mySerial.getByte();
      //  System.out.println( data );
      if (data == 0) {
        System.out.println("Data ==0");
        MainWindow.status_t.setText("Frame Grab Failed.");
        image.setRGB(0, 0, width, height, pixels, 0, width);

        repaint();
        return;
      }
      if (data == 1) {
        System.out.println("Got new Frame");
        new_frame = 1;
        if (MainWindow.cameraVersion == 2) {

          x_max = MainWindow.mySerial.getByte();
          y_max = MainWindow.mySerial.getByte();
          System.out.println(
            "X size: " + x_max + " Y size: " + y_max);
          MainWindow.frameProg.setMaximum(y_max - 1);
        } else {
          x_max = 80;
          y_max = 144;
          MainWindow.frameProg.setMaximum(80);
        }

        x = 0;
        y = 0;
        width_cnt = 0;
      } else if (data == 2) {

        if (MainWindow.cameraVersion == 2) {
          MainWindow.frameProg.setValue(y);
          System.out.println("Row " + y + " Width=" + width_cnt);
        } else {
          System.out.println("Rows: " + y + " Cols: " + x);
          MainWindow.frameProg.setValue(x / 2 + 1);
        }

        width_cnt = 0;
        if (MainWindow.cameraVersion == 1) {
          x += 2;
          y = 0;
        } else {
          x = 0;
          y++;
        }
        if (y > 288)
          y = 288;
        if (x > 352)
          x = 352;
      } else if (data == 3) {
        if (flipx == 1)
          flip(0);
        if (flipy == 1)
          flip(1);
        if (MainWindow.commandVal == 6)
          MainWindow.commandVal = 0;
        image.setRGB(0, 0, width, height, pixels, 0, width);
        repaint();
        MainWindow.status_t.setText("Frame Received");
        return;
      } else if (new_frame == 1) {
        width_cnt++;
        red = data;
        green = 0;
        blue = 0;
        if (chan == 0) {
          green = MainWindow.mySerial.getByte();
          blue = MainWindow.mySerial.getByte();
        } else {
          green = red;
          blue = red;
        }
        pix = 0;
        pix += blue;
        pix += green << 8;
        pix += red << 16;
        Color pixColor = new Color(pix);
        if (MainWindow.cameraVersion == 1) {
          pixels[((y + y_off) * width) + x + x_off] =
            pixColor.getRGB();
          pixels[((y + y_off) * width) + x + x_off + 1] =
            pixColor.getRGB();
          y++;
        } else {
          pixels[((y + y_off) * width) + x + x_off] =
            pixColor.getRGB();
          x++;
          pixels[((y + y_off) * width) + x + x_off] =
            pixColor.getRGB();
          x++;
        }
        if (y > 288)
          y = 288;
        if (x > 352)
          x = 352;
      }
    }
  }

  public boolean writeImage(String name) {
    boolean ret = false;
    ImageWriter w = null;
    BufferedImage blah = null;
    System.out.println("Trying to write...");

    try {

      Iterator writers = ImageIO.getImageWritersBySuffix("jpg");
      if (!(writers.hasNext())) {
        System.out.println("No readers for extension jpg");
        return false;
      }
      w = (ImageWriter) (writers.next());
      if (w == null) {
        System.out.println("No writers for extension jpg");
        return false;
      }

      File fo = new File(name);
      ImageOutputStream ios = ImageIO.createImageOutputStream(fo);
      w.setOutput(ios);
      ImageWriteParam iwparam = w.getDefaultWriteParam();
                iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ;
                iwparam.setCompressionQuality(1.0F);

      w.write(null, new IIOImage(image, null, null), iwparam);
      //w.write((BufferedImage) image,iwparam);
      System.out.println("File " + name + " written");
      ret = true;
      ios.close();
    } catch (Exception e) {
      System.out.println(e);
    }

    return true;
  }

  /*
    This is where the bitmap and tracking boxes are drawn.
    The actual background is add in update()
  */
  public void paintComponent(Graphics g) {
    int x_off, y_off;
    int w_width, w_height;
    w_width = getSize().width;
    w_height = getSize().height;

    /*if (offScreenImage == null) {
      offScreenImage = createImage(getSize().width, getSize().height);
      offScreenGC = offScreenImage.getGraphics();
    }
    g.drawImage(offScreenImage, 0, 0, this);
    */

    g.setColor(Color.black);
    g.fillRect(0, 0, w_width, w_height);
    x_off = (w_width - width) / 2;
    y_off = ((w_height - height) / 2) + 20;

    g.drawImage(image, x_off, y_off, this);

    for (int k = 0; k < 3; k++)
      if (objDirt[k] == 1) {
        if (k == 0)
          g.setColor(Color.cyan);
        else if (k == 1)
          g.setColor(Color.green);
        else if (k == 2)
          g.setColor(Color.magenta);
        for (int y = 0; y < height; y++)
          for (int x = 0; x < width; x++) {
            int rr, gr, br, pix;
            pix = pixels[y * width + x];
            br = pix & 0xFF;
            gr = pix >> 8 & 0xFF;
            rr = pix >> 16 & 0xFF;

            if (rr < rmax[k]
              && rr > rmin[k]
              && gr < gmax[k]
              && gr > gmin[k]
              && br < bmax[k]
              && br > bmin[k]) {

              g.fillRect(x + x_off, y + y_off, 1, 1);
            }

          }

      }
  }

}
TOP

Related Classes of CameraImage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.