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;
}
}