package developer.depth; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import org.opencv.calib3d.StereoSGBM; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Rect; import org.opencv.core.Size; import org.opencv.highgui.Highgui; import org.opencv.highgui.VideoCapture; import org.opencv.imgproc.Imgproc; import org.opencv.photo.Photo; import oculusPrime.Application; import oculusPrime.OculusImage; import oculusPrime.Util; import developer.image.OpenCVUtils; public class StereoTesting extends JFrame { static JPanel panel = new JPanel(); static JPanel panel_1 = new JPanel(); static JPanel panel_2 = new JPanel(); static JPanel panel_3 = new JPanel(); static final int yoffset = 21; // calibration said 27, but 25 seems a wee bit better static final int xoffset = 0; // static final int xres = 640; // static final int yres = 360; // static final int xres = 800; // static final int yres = 448; // camera metrics, degrees TODO: from gucview, NOT measured with openCV capture // static final double camFOVx169 = 68.46; // final static int maxDepthTopView = 5500; // final static double maxDispVal = 816; // final static double mmPerDispVal = 2286.0/(maxDispVal-255);// mm/disparity value /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { // private JPanel contentPane; public void run() { try { StereoTesting frame = new StereoTesting(); frame.setVisible(true); System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); // System.load("C:\\stuff\\opencv248\\build\\java\\x86\\opencv_java248.dll"); // frame.grabDockInStereo(); frame.sgbmTest(); // frame.saveImages(); // frame.loadImages(); // frame.streamTwoCameras(); // frame.distanceScanMatchTest(); System.out.println("done!"); } catch (Exception e) { e.printStackTrace(); } } }); } private void sgbmTest() { // developer.image.OpenCVUtils cv = new OpenCVUtils(); // Mat[] mats = captureImages(); Mat[] mats = loadImages(); Mat left = mats[0]; Mat right = mats[1]; Rect rect = new Rect(Stereo.xoffset, Stereo.yoffset,left.width() - Stereo.xoffset,left.height()-Stereo.yoffset); left = new Mat(left,rect); Mat leftc = new Mat(); left.copyTo(leftc); Imgproc.cvtColor(left, left, Imgproc.COLOR_BGR2GRAY); Imgproc.warpAffine(left, left, new Stereo().rotImage, left.size()); // rotate Imgproc.equalizeHist(left, left); // Photo.fastNlMeansDenoising(right, right); rect = new Rect(0,0,right.width()-Stereo.xoffset,right.height()-Stereo.yoffset); right = new Mat(right,rect); Imgproc.cvtColor(right, right, Imgproc.COLOR_BGR2GRAY); Imgproc.equalizeHist(right, right); // Photo.fastNlMeansDenoising(right, right); Stereo stereo = new Stereo(); Mat disparity = new Mat(); Mat disparityTopView = new Mat(); long start = System.currentTimeMillis(); // stereo.sbmImage.compute(left, right, disparity); stereo.sbmTopView.compute(left, right, disparity); stereo.sbmTopView.compute(left, right, disparityTopView); long duration = System.currentTimeMillis() - start; System.out.println("time: "+ String.valueOf(duration)); int y = disparity.height()/2; for (int x = 0; x<disparity.width(); x++) { double d = disparity.get(y, x)[0]; System.out.printf("%4d, ",(int) d); } System.out.println(""); // short[][] topView = Stereo.projectStereoHorizToTopViewFiltered(disparity, 240); // short[][] topView = Stereo.projectStereoHorizToTopViewFiltered(disparityTopView, 320); short[][] topView = Stereo.projectStereoHorizToTopViewFilteredLess(disparity, 240); topView = Stereo.topViewProbabilityRendering(topView); JLabel pic0 = new JLabel(new ImageIcon(OpenCVUtils.matToBufferedImage(left))); JLabel pic1 = new JLabel(new ImageIcon(OpenCVUtils.matToBufferedImage(right))); Core.normalize(disparity, disparity, 0, 255, Core.NORM_MINMAX, CvType.CV_8U); // Imgproc.cvtColor(left, left,Imgproc.COLOR_BGR2GRAY); // Imgproc.resize(leftc, leftc, new Size(120, 68)); // Imgproc.cvtColor(disparity, disparity,Imgproc.COLOR_GRAY2BGR); // leftc.copyTo(new Mat(disparity, new Rect(0,0,120,68))); JLabel pic2 = new JLabel(new ImageIcon(OpenCVUtils.matToBufferedImage(disparity))); Mapper.addArcPath(topView, 0, 0); // Mapper.addArcPath(topView, 10, -0.6); // Mapper.addArcPath(topView, 0, 45); BufferedImage img = ScanUtils.cellsToImage(Mapper.map); JLabel pic3 = new JLabel(new ImageIcon(img)); // Mat mtv = Stereo.convertShortToMat(topView); // leftc.copyTo(new Mat(mtv, new Rect(0,mtv.height()-68-1, 120,68))); // JLabel pic3 = new JLabel(new ImageIcon(cv.matToBufferedImage(mtv))); // System.out.println("mtv width: "+mtv.width()+", height: "+mtv.height()); panel.add(pic0); panel_1.add(pic1); panel_2.add(pic2); panel_3.add(pic3); panel.repaint(); panel_1.repaint(); panel_2.repaint(); panel_3.repaint(); // System.out.println(disparity.width()+", "+disparity.height()); } private void saveImages() { Mat[] mats = captureImages(); Mat left = mats[0]; Mat right = mats[1]; String folder = "/home/colin/temp/"; Highgui.imwrite(folder+"left.png", left); Highgui.imwrite(folder+"right.png", right); } private Mat[] loadImages() { String folder = "Z:\\xaxxon\\oculusPrime\\software\\scans-dev-temp\\stereo\\"; // String folder = "/mnt/skyzorg/xaxxon/oculusPrime/software/scans-dev-temp/stereo/"; Mat left = Highgui.imread(folder+"left0.png"); Mat right = Highgui.imread(folder+"right0.png"); // Mat left = Highgui.imread(folder+"left500_1-12.png"); // Mat right = Highgui.imread(folder+"right500_1-12.png"); // Mat left = Highgui.imread(folder+"left1.png"); // Mat right = Highgui.imread(folder+"right1.png"); // Mat left = Highgui.imread(folder+"left500_3-25.png"); // Mat right = Highgui.imread(folder+"right500_3-25.png"); return new Mat[] {left, right}; } private void distanceScanMatchTest() { int h = 320; Stereo stereo = new Stereo(); // developer.image.OpenCVUtils cv = new OpenCVUtils(); String folder = "Z:\\xaxxon\\oculusPrime\\software\\scans-dev-temp\\stereo\\"; // String folder = "/mnt/skyzorg/xaxxon/oculusPrime/software/scans-dev-temp/stereo/"; // Mat left = Highgui.imread(folder+"left2.png"); // Mat right = Highgui.imread(folder+"right2.png"); // Mat left = Highgui.imread(folder+"left1.png"); // Mat right = Highgui.imread(folder+"right1.png"); Mat left = Highgui.imread(folder+"left0.png"); Mat right = Highgui.imread(folder+"right0.png"); Mat disparity = stereo.generateDisparity(left, right, stereo.sbmTopView); short[][] topViewBefore = Stereo.projectStereoHorizToTopViewFiltered(disparity, h); Mat m = Stereo.convertShortToMat(topViewBefore); panel.setBounds(5, 5, m.width(), m.height()+5); JLabel pic0 = new JLabel(new ImageIcon(OpenCVUtils.matToBufferedImage(m))); panel.add(pic0); panel.repaint(); // left = Highgui.imread(folder+"left2-415-0_6.png"); // right = Highgui.imread(folder+"right2-415-0_6.png"); left = Highgui.imread(folder+"left500_3-25.png"); right = Highgui.imread(folder+"right500_3-25.png"); // left = Highgui.imread(folder+"left500_1-12.png"); // right = Highgui.imread(folder+"right500_1-12.png"); disparity = stereo.generateDisparity(left, right, stereo.sbmTopView); short[][] topViewAfter = Stereo.projectStereoHorizToTopViewFiltered(disparity, h); m = Stereo.convertShortToMat(topViewAfter); panel_1.setBounds(640, 5, m.width(), m.height()+5); JLabel pic1 = new JLabel(new ImageIcon(OpenCVUtils.matToBufferedImage(m))); panel_1.add(pic1); panel_1.repaint(); double angle = 3.25; int d= Stereo.findDistanceTopView(topViewBefore, topViewAfter, angle, 500)[0]; Mapper.addArcPath(topViewBefore, 0, 0); Mapper.addArcPath(topViewAfter, d, angle); BufferedImage img = ScanUtils.cellsToImage(Mapper.map); JLabel pic2 = new JLabel(new ImageIcon(img)); panel_2.setBounds(5, 340, img.getWidth(), img.getHeight()+10); panel_2.add(pic2); panel_2.repaint(); System.out.println(d); } private Mat[] captureImages() { VideoCapture capture1 = new VideoCapture(1); VideoCapture capture0 = new VideoCapture(0); capture1.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, Stereo.xres); capture1.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, Stereo.yres); capture0.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, Stereo.xres); capture0.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, Stereo.yres); Util.delay(1000); Mat left = new Mat(); capture1.grab(); // discard 1st frame capture1.read(left); Mat right = new Mat(); capture0.grab(); // discard 1st frame capture0.read(right); return new Mat[]{left, right}; } private void streamTwoCameras() { System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); System.out.println(Core.NATIVE_LIBRARY_NAME); // final developer.image.OpenCVUtils cv = new OpenCVUtils(); final VideoCapture capture1 = new VideoCapture(1); final VideoCapture capture0 = new VideoCapture(0); capture1.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, Stereo.xres); capture1.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, Stereo.yres); capture0.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, Stereo.xres); capture0.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, Stereo.yres); // capture1.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, 800); // capture1.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, 448); // capture0.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, 800); // capture0.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, 448); final JLabel pic0 = new JLabel(); panel.add(pic0); final JLabel pic1 = new JLabel(); panel_1.add(pic1); new Thread(new Runnable() { public void run() { try { while(true) { if( capture1.isOpened()) { Mat left = new Mat(); capture1.read(left); pic0.setIcon(new ImageIcon(OpenCVUtils.matToBufferedImage(left))); panel.repaint(); } // Thread.sleep(200); if( capture0.isOpened()) { Mat right = new Mat(); capture0.read(right); pic1.setIcon(new ImageIcon(OpenCVUtils.matToBufferedImage(right))); panel_1.repaint(); } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } /* private void grabDockInStereo() { developer.image.OpenCVUtils cv = new OpenCVUtils(); BufferedImage img; OculusImage oculusImage = new OculusImage(); int[] argb; String results[]; String str; int x, y, w, h, ctrx, ctry; Graphics2D g2d; oculusImage.dockSettings("1.2162162_0.21891892_0.18708709_0.24039039_135_134_90_74_-0.0"); img = cv.webcamCapture(1); oculusImage.lastThreshhold = -1; argb = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); results = oculusImage.findBlobs(argb, img.getWidth(), img.getHeight()); x = Integer.parseInt(results[0]); y = Integer.parseInt(results[1]); w = Integer.parseInt(results[2]); h = Integer.parseInt(results[3]); ctrx = x+w/2; ctry = y+h/2; // img.setRGB(x, y, 0xff0000); g2d = img.createGraphics(); g2d.setColor(new Color(255,0,0)); g2d.drawRect(x, y, w, h); JLabel pic0 = new JLabel(new ImageIcon(img)); panel.add(pic0); panel.repaint(); str = x+" "+y+" "+w+" "+h+" "+results[4]; System.out.println(str); img = cv.webcamCapture(0); oculusImage.lastThreshhold = -1; argb = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); results = oculusImage.findBlobs(argb, img.getWidth(), img.getHeight()); x = Integer.parseInt(results[0]); y = Integer.parseInt(results[1]); w = Integer.parseInt(results[2]); h = Integer.parseInt(results[3]); ctrx = x+w/2; ctry = y+h/2; img.setRGB(x, y, 0xff0000); g2d = img.createGraphics(); g2d.setColor(new Color(255,0,0)); g2d.drawRect(x, y, w, h); JLabel pic1 = new JLabel(new ImageIcon(img)); panel_1.add(pic1); panel_1.repaint(); str = x+" "+y+" "+w+" "+h+" "+results[4]; System.out.println(str); } */ /** * Create the frame. */ public StereoTesting() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(50, 50, 1300, 800-Stereo.yoffset*2); JPanel contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); panel.setBounds(5, 0, 640, 365-Stereo.yoffset); panel_1.setBounds(650, 0, 640, 365-Stereo.yoffset); panel_2.setBounds(5, 375-Stereo.yoffset, 640, 365-Stereo.yoffset); panel_3.setBounds(650, 375-Stereo.yoffset, 435, 325); contentPane.add(panel); contentPane.add(panel_1); contentPane.add(panel_2); contentPane.add(panel_3); } }