您的位置 首页 java

Java,通过JavaCV调用计算机的摄像头,实现跨平台视频/图像处理

JavaCV

java CV提供了在 计算机视觉 领域的封装库,包括: OpenCV 、ARToolKitPlus、libdc1394 2.x 、PGR FlyCapture和FFmpeg。此外,该工具可以很容易地使用 Java 平台的功能。

JavaCV还带有硬件加速的全屏幕图像显示(CanvasFrame),易于在多个内核中执行并行代码(并行),用户友好的几何和色彩的相机和投影仪校准(GeometricCalibrator, ProCam GeometricCalibrator,ProCamColorCalibrator ),检测和特征点(ObjectFinder),一类是实现投影,摄像系统(直接图像对齐设置匹配主要GNImageAligner,ProjectiveTransformer,ProjectiveGainBiasTransformer,ProCamTransformer 和ReflectanceInitializer),以及在JavaCV类杂项功能。

地址:,

JavaCV和OpenCV

1、JavaCV包含了OpenCV,也就是说JavaCV比OpenCV多封装了很多库。

2、OpenCV的性能高于JavaCV。

pom.xml

 <!-- javacv-platform -->
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.4</version>
</dependency>  

代码实现

案例1:

 package com.what21.opencv01.demo02;

import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameGrabber;

import  javax .swing.*;

public class JavaCVCanvasFrame01 {

    public  static   void  main(String[] args) throws  Exception  {
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        //开始获取摄像头数据
        grabber.start();
        //新建一个窗口
        CanvasFrame  canvas  = new CanvasFrame("我的摄像头");
        canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        canvas.setSize(800, 600);
        canvas.setAlwaysOnTop(true);
        while (true) {
            //窗口是否关闭
             if  (!canvas.isDisplayable()) {
                //停止抓取
                grabber.stop();
                //退出
                System.exit(-1);
            }
            // frame是一帧视频图像
            Frame frame = grabber.grab();
            canvas.showImage(frame);
            //50毫秒刷新一次图像
            Thread.sleep(50);
        }
    }

}  

效果:

案例2:

 package com.what21.opencv01.demo02;

import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.VideoInputFrameGrabber;

import javax.swing.*;

public class JavaCVCanvasFrame02 {

    public static void main(String[] args) throws Exception {
        VideoInputFrameGrabber grabber = VideoInputFrameGrabber.createDefault(0);
        // 开始获取摄像头数据
        grabber.start();
        //新建一个窗口
        CanvasFrame canvas = new CanvasFrame("我的摄像头");
        canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        canvas.setSize(800, 600);
        canvas.setAlwaysOnTop(true);
        while (true) {
            //窗口是否关闭
            if (!canvas.isDisplayable()) {
                //停止抓取
                grabber.stop();
                //退出
                System.exit(-1);
            }
            // frame是一帧视频图像
            Frame frame = grabber.grab();
            canvas.showImage(frame);
            //50毫秒刷新一次图像
            Thread.sleep(50);
        }
    }

}  

案例3:

 package com.what21.opencv01.demo02;

import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;

import javax.swing.*;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;

public class JavaCVCanvasFrame03 {

    public static void main(String[] args) throws Exception {
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        //开始获取摄像头数据
        grabber.start();
        //新建一个窗口
        CanvasFrame canvas = new CanvasFrame("我的摄像头");
        canvas.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        canvas.setSize(800, 600);
        canvas.setAlwaysOnTop(true);
        while (true) {
            //窗口是否关闭
            if (!canvas.isDisplayable()) {
                //停止抓取
                grabber.stop();
                //退出
                System.exit(-1);
            }
            Frame imageFrame = grabber.grab();
            Java2DFrameConverter converter = new Java2DFrameConverter();
            BufferedImage image = converter.getBufferedImage(imageFrame);
            // 美图效果
            // ImageToBeautifyUtils.beautify3(image);
            canvas.showImage(image);
            // 50毫秒刷新一次图像
            Thread.sleep(50);
        }
    }

}  
 package com.what21.opencv01.demo02;

import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;

public class ImageToGrayUtils {

    /**
     * @param image
     * @return
     */    public static BufferedImage toGray1(BufferedImage image) {
        final int width = image.getWidth();
        final int height = image.getHeight();
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                int rgb = image.getRGB(i, j);
                image.setRGB(i, j, grayRGB(Integer.toHexString(rgb)));
            }
        }
        return image;
    }

    /**
     * @param a RGB 
     * @return
     */     private  static int grayRGB(String argb) {
        //ARGB前两位是透明度,后面开始是RGB
        int r = Integer.parseInt(argb.substring(2, 4), 16);
        int g = Integer.parseInt(argb.substring(4, 6), 16);
        int b = Integer.parseInt(argb.substring(6, 8), 16);
        //平均值
        String average = Integer.toHexString((r + g + b) / 3);

        if (average.length() == 1) {
             average  = "0" + average;
        }
        //RGB都变成平均值
        return Integer.parseInt(average + average + average, 16);
    }

    /**
     * @param image
     * @return
     */    public static BufferedImage toGray2(BufferedImage image) {
        ColorSpace cs = ColorSpace. getInstance (ColorSpace.CS_GRAY);
        ColorConvertOp op = new ColorConvertOp(cs, null);
        image = op.filter(image, null);
        return image;
    }

}  
 package com.what21.opencv01.demo02;

import java.awt.*;
import java.awt.image.BufferedImage;

public class ImageToBeautifyUtils {

    /**
     * @param image
     * @return
     */    public static BufferedImage beautify1(BufferedImage image) {
        String base = "IT小奋斗";
         graphics 2D graphics2D = (Graphics2D) image.getGraphics();
        graphics2D.setFont(new Font("宋体", Font.BOLD, 12));
        int index = 0;
        for (int y = 0; y < image.getHeight(); y += 12) {
            for (int x = 0; x < image.getWidth(); x += 12) {
                int pxcolor = image.getRGB(x, y);
                int r = (pxcolor & 0xff0000) >> 16,
                        g = (pxcolor & 0xff00) >> 8,
                        b = pxcolor & 0xff;
                graphics2D.setColor(new Color(r, g, b));
                graphics2D.drawString(String.valueOf(base.charAt(index % base.length())), x, y);
                index++;
            }
        }
        return image;
    }

    /**
     * @param image
     * @return
     */    public static BufferedImage beautify2(BufferedImage image) {
        Graphics2D graphics2D = (Graphics2D) image.getGraphics();
        final int width = image.getWidth();
        final int height = image.getHeight();
        int[][] data = new int[width][height];
        for (int i = 0; i < data.length; i += 5) {
            for (int j = 0; j < data[i].length; j += 5) {
                Color c = new Color(data[i][j]);
                graphics2D.setColor(c);
                graphics2D.fillOval(i, j, 4, 4);
            }
        }
        return image;
    }

    /**
     * @param image
     * @return
     */    public static BufferedImage beautify3(BufferedImage image) {
        Graphics2D graphics2D = (Graphics2D) image.createGraphics();
        final int width = image.getWidth();
        final int height = image.getHeight();
        int[][] data = new int[width][height];
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                Color color = new Color(data[i][j]);
                int r = color.getRed();
                color = new Color(r, 0, 0);
                graphics2D.setColor(color);
                graphics2D.drawLine(i, j, i, j);
            }
        }
        return image;
    }

}  

文章来源:智云一二三科技

文章标题:Java,通过JavaCV调用计算机的摄像头,实现跨平台视频/图像处理

文章地址:https://www.zhihuclub.com/191506.shtml

关于作者: 智云科技

热门文章

网站地图