20170505:javacv之java.awt.HeadlessException


首先贴上异常信息:

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版权协议,转载请附上原文出处链接和本声明。