20170505:javacv之java.awt.HeadlessException

xiaoxiao2021-02-28  100

首先贴上异常信息:

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

转载请注明原文地址: https://www.6miu.com/read-54806.html

最新回复(0)