首先贴上异常信息:
java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:233)
at org.bytedeco.javacv.CanvasFrame.<init>(CanvasFrame.java:124)
at com.face.CameraCapture.startCamera(CameraCapture.java:141)
at com.face.CameraCapture.run(CameraCapture.java:176)
at java.lang.Thread.run(Thread.java:745)异常信息的意思是,找不到设备
上代码
package com.face;
import com.ganwei.util.AllFileConstant;
import com.ganwei.util.FtpUtil;
import com.ganwei.util.FtpUtil.Ftp;
import com.megvii.cloud.http.CommonOperate;
import com.megvii.cloud.http.FaceSetOperate;
import org.apache.log4j.Logger;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import static org.bytedeco.javacpp.opencv_core.cvReleaseImage;
public class CameraCapture implements Runnable{
private static Logger logger = Logger.getLogger(CameraCapture.class);
private ExecuteFace executeFace;
static BufferedImage bImage;
public TimerAction timerAction;
private CommonOperate operate;
private FaceSetOperate faceSetOperate;
public static Timer timer;
public HandleFace handleFace;
private static int width,height;
private boolean ftpFlag;
private ResultOfFace rof = ResultOfFace.getInstance();
private Ftp f;
private static CameraCapture cc;
// private HandleFace hf;
class TimerAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
ImageIO.write(bImage, AllFileConstant.suffix, new File(AllFileConstant.savedImageFile));
} catch (IOException e) {
e.printStackTrace();
}
try {
if (handleFace.detect()){//人脸检测
rof.setIfHaveFace(true);//存在人脸
rof.setFacesList(handleFace.currentTokenList);//存入人脸信息
rof.setAndroidGsonsList(handleFace.search(rof.getFacesList()));//对比人脸,返回认识的人集合;然后储存3种list(认识,不认识,全部)
}else
rof.setIfHaveFace(false);//不存在人脸
} catch (Exception e) {
logger.error("face++请求失败,异常信息:"+e);
}
}
}
public CameraCapture() {
handleFace = new HandleFace();
timerAction = new TimerAction();
executeFace = new ExecuteFace();
}
/**
* ftp链接
*/
public void connectFtp(){
try {
ftpFlag = FtpUtil.connectFtp(f);
logger.debug(ftpFlag);
} catch (java.lang.Exception e) {
e.printStackTrace();
}
}
public static CameraCapture getInstance(){
if (cc == null) {
cc = new CameraCapture();
return cc;
}else
return cc;
}
public void startCamera(){
try{
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start(); // 开始获取摄像头数据
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();//转换器
Frame frame = grabber.grab();
opencv_core.IplImage grabbedImage = converter.convert(frame);
//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加
width = grabbedImage.width();
height = grabbedImage.height();
bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D bGraphics = bImage.createGraphics();
CanvasFrame canvas = new CanvasFrame("Camera", 1);
canvas.setCanvasSize(width, height);
timer = new Timer(3000, timerAction);
// 设置每x秒保存一次照片。
timer.start();
while (canvas.isVisible() && (frame = grabber.grab()) != null) {
//注释掉下行代码,及cavas.isVisibal,在Linux上可能不会出现警告
canvas.showImage(frame);
bGraphics.drawImage(iplToBufImgData(grabbedImage), null, 0, 0);
}
cvReleaseImage(grabbedImage);
grabber.stop();
canvas.dispose();
}catch (Exception e){
e.printStackTrace();
}
}
public static BufferedImage iplToBufImgData(IplImage mat) {
if (mat.height() > 0 && mat.width() > 0) {
BufferedImage image = new BufferedImage(mat.width(), mat.height(),
BufferedImage.TYPE_3BYTE_BGR);
WritableRaster raster = image.getRaster();
DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
byte[] data = dataBuffer.getData();
mat.getByteBuffer().get(data);
return image;
}
return null;
}
@Override
public void run(){
startCamera();
}
}在windows下运行不会抛出异常,但是在Linux环境下,会出异常;
最后找到的问题在main方法初始化
public static void main(String args[]) {
System.setProperty("java.awt.headless", "true");
MainView main = new MainView();
myttsiat = MyTtsIat.getMyTtsIat();
myttsiat.setVoice(AllFileConstant.Beauty);
myttsiat.setRecognizerListener(main.getReconizer());
myttsiat.setStart();
}注意这一行
System.setProperty("java.awt.headless", "true");这行设置是在Linux下,程序以无外设的条件运行(包括鼠标,键盘,显示器等)
但是程序这里会用到显示器,所以就抛出异常了;
Graphics2D bGraphics = bImage.createGraphics();
CanvasFrame canvas = new CanvasFrame("Camera", 1);
canvas.setCanvasSize(width, height);
版权声明:本文为qq_31145141原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。